Shell碎碎念

1. 字符串如何大小写转换

str="This is a Bash Shell script."

1> tr方式     

newstr=`tr '[A-Z]' '[a-z]' <<<"$str"`或者 newstr=$(echo $str |tr '[a-z]' '[A-Z]')

2> typeset 

typeset -u VARIABLE (把VARIABLE的小写转换成大写)

typeset -l VARIABLE (把VARIABLE的大写转换成小写)

如:

[oracle@node3 ~]$ typeset -u str
[oracle@node3 ~]$ str="This is a Bash Shell script."
[oracle@node3 ~]$ echo $str
THIS IS A BASH SHELL SCRIPT.

2. 判断变量中是否包含某个字符串

str="this is a string"
[[ $str =~ "this" ]] && echo "$str contains this"

3. 将文本文件的内容按行保存到数组中

#!/bin/bash
i=0
while read line
do
   a[$i]="$line"
   i=$[$i+1]
done < dept.txt
for (( i=0; i<3; i++ ))
do
  echo "${a[$i]}"
done

注意:在这里就不要用 cat dept.txt |while read line了,因为管道的命令都是在子Shell中执行的,这意味着在子Shell中赋值的变量对父Shell是无效的。在本例中,该脚本无法读取赋给数组的值。

4. 昨天的日期

   date -d "1 day ago" "+%Y-%m-%d"

   date -d last-day +%Y-%m-%d

5. 指定日期的后一天

   date -d "20150303 1 days" +%Y%m%d

6. awk将最后一行的每一列分行打印

     awk 'END{for(i=1;i<=NF;i++){printf "%s ",$i}}'

7. AWK去掉空格

   1>    sub(/^[[:blank:]]*/,"",变量) 是去掉变量左边的空白符
           sub(/[[:blank:]]*$/,"",变量) 是去掉变量右边的空白符
           gsub(/[[:blank:]]*/,"",变量) 是去掉变量中所有的空白符

    譬如: echo " hello world " | awk '{gsub(/[[:blank:]]*/,"",$0);print "|" $0 "|"}'

             |helloworld|

    2>    echo " hello world " | awk '{sub("^ *","");sub(" *$","");print "|" $0 "|"}'

            |hello world|

8. shell中如何实现数值向上取整

   a=1.1

   echo $a|awk '{print int($a)==$a?$a:int($a+1)}'

9. 如何显示Shell脚本的执行过程

    1> sh -x 1.sh

    2> 

#!/bin/bash -x
word1=Hello
word2=World
echo $word1 $word2

    执行结果如下:

[oracle@node1 ~]$ ./1.sh   -->>注意执行的方式,如果是sh 1.sh则没有这种效果
+ word1=Hello
+ word2=World
+ echo Hello World
Hello World

   3> 只希望一部分显示执行过程,可使用set -x 和set +x

[oracle@node1 ~]$ cat 1.sh
#!/bin/bash
set -x
word1=Hello
word2=World
set +x
echo $word1 $word2
[oracle@node1
~]$ ./1.sh + word1=Hello + word2=World + set +x Hello World

10. > /dev/null 2>&1  

       将标准输出和标准错误重定向到/dev/null中

11. 数组

$ fruits[0]="Apple"
$ fruits[1]="Grape"
$ fruits[2]="Orange"
$ echo "${fruits[0]} ${fruits[1]} ${fruits[2]}"
Apple Grape Orange
$ fruits=("Apple" "Grape" "Orange")   -->> 如何对数组进行赋值
$ echo "${fruits[0]} ${fruits[1]} ${fruits[2]}"
Apple Grape Orange
$ echo "${#fruits[@]}"   -->> 如何获取数组的个数
3
$ echo "${fruits[@]}"   -->> 如何获取数组的值
Apple Grape Orange

12. 如何用grep去掉空格和注释

     grep -Ev "^$|^#" db_install.rsp 

13. 如何找出tkprof命令生成的outputfile中的select语句

     awk 'BEGIN{i=0;j=0}{if($0~"select"){i=NR;j=NR;print " "}if($0~/^$/) j=NR;if(i==j) print $0 }' 1.txt

     因为select语句没有写在一行,且select语句结束以后会有空行,所以解决的思路是打印select及select以下的行,直到空行。所以当碰到select语句的时候,将行值赋给i和j,当碰到空行时,将行数赋给j,这样j就发生了改变。判断是否打印所在行的值就看i和j是否相等。

     这样打印出来的内容会有点难看,select和select语句之间没有空行,所以在碰到select的时候就打印一个空行。

     注意:判断空行的写法/^$/,BEGIN{i=0;j=0}代表将i和j初始化为0,如果没有BEGIN语句,则处理每一行的时候i和j的值都会重置为0

14. 在第三行行尾添加;号

     sed -ie '3s/$/;/'

15. Shell中计算

      num=$[$num+1]

      注意中间不能有空格,不然会报以下错误

[root@mysql-slave1 ~]# num=1
[root@mysql-slave1 ~]# num=$[$num+1]
[root@mysql-slave1 ~]# echo $num
2
[root@mysql-slave1 ~]# num =$[$num+1]
-bash: num: command not found
[root@mysql-slave1 ~]# num = $[$num+1]
-bash: num: command not found

16. 如何去掉字符串中的空白字符

     # echo " aa bb ccc "| tr -d  [:blank:]

     aabbccc

17. 删除指定文件外的其它文件

     ls |grep -v 2.sh |xargs rm -rf 

18. 如何将每一行的数据拼凑成一行输出

     awk 'BEGIN{T=""}{T=T","$1}END{print T}' host.txt 

19. 如何删除一个变量中的空格和换行符

#!/bin/bash
output="    678                 
       456  "
echo $output
echo "$output"
output="$(echo  "${output}" | sed -e 'N;s/[
[[:space:]]]*//g')"
echo "$output"

     执行结果如下:

678 456
    678                 
       456  
678456

20. 如何查看一个字符串左侧有多少个0

[root@localhost ~]# file='00012hello'
[root@localhost ~]# echo ${file%0*} |wc -L
2

     在此基础上加1就可以了

21. shell逻辑判断

[ -a FILE ]  如果 FILE 存在则为真。  
[ -b FILE ]  如果 FILE 存在且是一个块特殊文件则为真。  
[ -c FILE ]  如果 FILE 存在且是一个字特殊文件则为真。  
[ -d FILE ]  如果 FILE 存在且是一个目录则为真。  
[ -e FILE ]  如果 FILE 存在则为真。  
[ -f FILE ]  如果 FILE 存在且是一个普通文件则为真。  
[ -g FILE ]  如果 FILE 存在且已经设置了SGID则为真。  
[ -h FILE ]  如果 FILE 存在且是一个符号连接则为真。  
[ -k FILE ]  如果 FILE 存在且已经设置了粘制位则为真。  
[ -p FILE ]  如果 FILE 存在且是一个名字管道(F如果O)则为真。  
[ -r FILE ]  如果 FILE 存在且是可读的则为真。  
[ -s FILE ]  如果 FILE 存在且大小不为0则为真。  
[ -t FD ]  如果文件描述符 FD 打开且指向一个终端则为真。  
[ -u FILE ]  如果 FILE 存在且设置了SUID (set user ID)则为真。  
[ -w FILE ]  如果 FILE 如果 FILE 存在且是可写的则为真。  
[ -x FILE ]  如果 FILE 存在且是可执行的则为真。  
[ -O FILE ]  如果 FILE 存在且属有效用户ID则为真。  
[ -G FILE ]  如果 FILE 存在且属有效用户组则为真。  
[ -L FILE ]  如果 FILE 存在且是一个符号连接则为真。  
[ -N FILE ]  如果 FILE 存在 and has been mod如果ied since it was last read则为真。  
[ -S FILE ]  如果 FILE 存在且是一个套接字则为真。  
[ FILE1 -nt FILE2 ]  如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。  
[ FILE1 -ot FILE2 ]  如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。  
[ FILE1 -ef FILE2 ]  如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。  
[ -o OPTIONNAME ]  如果 shell选项 “OPTIONNAME” 开启则为真。  
[ -z STRING ]  “STRING” 的长度为零则为真。  
[ -n STRING ] or [ STRING ]  “STRING” 的长度为非零 non-zero则为真。  
[ STRING1 == STRING2 ]  如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。  
[ STRING1 != STRING2 ]  如果字符串不相等则为真。 
[ STRING1 < STRING2 ]  如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。  
[ STRING1 > STRING2 ]  如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。  
[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.