[关闭]
@tankle 2015-04-14T08:27:16.000000Z 字数 3163 阅读 2133

Shell 学习

linux


linux中shell变量#,@,0,1,$2的含义解释:

  1. #变量说明:
  2. $$
  3. #Shell本身的PID(ProcessID)
  4. $!
  5. #Shell最后运行的后台Process的PID
  6. $?
  7. #最后运行的命令的结束代码(返回值)
  8. $-
  9. #使用Set命令设定的Flag一览
  10. $*
  11. #所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
  12. $@
  13. #所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
  14. $#
  15. #添加到Shell的参数个数
  16. $0
  17. #Shell本身的文件名
  18. $1$n
  19. #添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

条件测试

大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等,通常用"[]"来表示条件测试。注意这里的空格很重要。要确保方括号的空格。

  1. if ....; then
  2.   ....
  3. elif ....; then
  4.   ....
  5. else
  6.   ....
  7. fi
  8. [ -f "somefile" ] :判断是否是一个文件
  9. [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
  10. [ -n "$var" ] :判断$var变量是否有值
  11. [ "$a" = "$b" ] :判断$a$b是否相等
  12. -r file     用户可读为真
  13.   -w file     用户可写为真
  14.   -x file     用户可执行为真
  15.   -f file     文件为正规文件为真
  16.   -d file     文件为目录为真
  17.   -c file     文件为字符特殊文件为真
  18.   -b file     文件为块特殊文件为真
  19.   -s file     文件大小非0时为真
  20.   -t file     当文件描述符(默认为1)指定的设备为终端时为真

含条件选择的shell脚本

对于不含变量的任务简单shell脚本一般能胜任。但在执行一些决策任务时,就需要包含if/then的条件判断了。shell脚本编程支持此类运算,包括比较运算、判断文件是否存在等。基本的if条件命令选项有:

  1. -eq —比较两个参数是否相等(例如,if [ 2 eq 5 ])
  2. -ne —比较两个参数是否不相等
  3. -lt —参数1是否小于参数2
  4. -le —参数1是否小于等于参数2
  5. -gt —参数1是否大于参数2
  6. -ge —参数1是否大于等于参数2
  7. -f 检查某文件是否存在(例如,if [ -f "filename" ])
  8. -d ## 标题 ##— 检查目录是否存在

几乎所有的判断都可以用这些比较运算符实现。脚本中常用-f命令选项在执行某一文件之前检查它是否存在。

判断文件是否存在

  1. #!/bin/sh
  2. YACCESS=`date -d yesterday +%Y%m%d`
  3. FILE="access_$YACCESS.log.tgz"
  4. cd /data/nginx/logs
  5. if [ -f "$FILE" ];then
  6. echo "OK"
  7. else
  8. echo "error $FILE" > error.log
  9. mail -s "$FILE backup fail" xxxx@yyyy.com <error.log
  10. fi

  1. #!/bin/sh
  2. #
  3. DIR=/data/img_cache
  4. DAY=`date +"%Y-%m-%d %H:%M"`
  5. NUM=`ls $DIR |wc -l`
  6. DIRNAME=`ls $DIR| grep leveldb | head -n 1 | awk '{print $NF}'`
  7. if [[ $NUM -gt 3 ]];then
  8. rm -rf $DIR/$DIRNAME
  9. echo "---------$DAY----($DIR)-----------------------" >> /tmp/img_cache.log
  10. echo "$DIRNAME Deleted successful" >> /tmp/img_cache.log
  11. fi

补充:文件测试操作:
返回true,如果:

  1. -e 文件存在
  2. -a 文件存在(已被弃用)
  3. -f 被测文件是一个regular文件(正常文件,非目录或设备)
  4. -s 文件长度不为0
  5. -d 被测对象是目录
  6. -b 被测对象是块设备
  7. -c 被测对象是字符设备
  8. -p 被测对象是管道
  9. -h 被测文件是符号连接
  10. -L 被测文件是符号连接
  11. -S(大写) 被测文件是一个socket
  12. -t 关联到一个终端设备的文件描述符。用来检测脚本的stdin[-t0]或[-t1]是一个终端
  13. -r 文件具有读权限,针对运行脚本的用户
  14. -w 文件具有写权限,针对运行脚本的用户
  15. -x 文件具有执行权限,针对运行脚本的用户
  16. -u set-user-id(suid)标志到文件,即普通用户可以使用的root权限文件,通过chmod +s file实现
  17. -k 设置粘贴位
  18. -O 运行脚本的用户是文件的所有者
  19. -G 文件的group-id和运行脚本的用户相同
  20. -N 从文件最后被阅读到现在,是否被修改
  21. f1 -nt f2 文件f1是否比f2
  22. f1 -ot f2 文件f1是否比f2
  23. f1 -ef f2 文件f1f2是否硬连接到同一个文件
  24. 二元比较操作符,比较变量或比较数字
  25. 整数比较:
  26. -eq 等于 if [ "$a" -eq "$b" ]
  27. -ne 不等于 if [ "$a" -ne "$b" ]
  28. -gt 大于 if [ "$a" -gt "$b" ]
  29. -ge 大于等于 if [ "$a" -ge "$b" ]
  30. -lt 小于 if [ "$a" -lt "$b" ]
  31. -le 小于等于 if [ "$a" -le "$b" ]
  32. < 小于(需要双括号) (( "$a" < "$b" ))
  33. <= 小于等于(...) (( "$a" <= "$b" ))
  34. > 大于(...) (( "$a" > "$b" ))
  35. >= 大于等于(...) (( "$a" >= "$b" ))
  36. 字符串比较:
  37. = 等于 if [ "$a" = "$b" ]
  38. == 与=等价
  39. != 不等于 if [ "$a" = "$b" ]
  40. < 小于,在ASCII字母中的顺序:
  41. if [[ "$a" < "$b" ]]
  42. if [ "$a" \< "$b" ] #需要对<进行转义
  43. > 大于
  44. -z 字符串为null,即长度为0
  45. -n 字符串不为null,即长度不为0

截取字符串

  1. #第一种方法:
  2. ${varible##*string } 从左向右截取最后一个string后的字符串
  3. ${varible#*string} 从左向右截取第一个string后的字符串
  4. ${varible%%string*} 从右向左截取最后一个string后的字符串
  5. ${varible%string*} 从右向左截取第一个string后的字符串
  6. #例子:
  7. TESTSTRING="teststring helloworld"
  8. echo ${TESTSTRING##*s}
  9. "tring helloworld"
  10. echo ${TESTSTRING#*s}
  11. "tstring helloworld"
  12. echo ${TESTSTRING%%s*}
  13. "te"
  14. echo ${TESTSTRING%s*}
  15. "test"
  16. #第二种方法:
  17. #${varible:n1:n2} 截取从n1到n2长度的字符串
  18. TESTSTRING="teststring helloworld"
  19. echo ${TESTSTRING:0:4}
  20. "test"
  21. echo ${TESTSTRING:1:5}
  22. "ests"
  23. echo ${TESTSTRING:0:-2}
  24. "teststring hellowor"

数组

  1. #!/bin/bash
  2. array1[0]=one
  3. array1[1]=1
  4. echo ${array1[0]}
  5. echo ${array1[1]}
  6. array2=( one two three )
  7. echo ${array2[0]}
  8. echo ${array2[2]}
  9. array3=( [9]=nine [11]=11 )
  10. echo ${array3[9]}
  11. echo ${array3[11]}
  12. read -a array4
  13. for i in "${array4[@]}"
  14. do
  15. echo $i
  16. done
  17. exit 0

连接字符串

  1. var1=/etc/
  2. var2=yum.repos.d/
  3. var3=${var1}${var2}
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注