变量(代码编写)注意事项
01) ;分号是命令界定符; 02) 变量默认为全局变量 03) 双引号内能解释变量,但变量替换在单引号中无效; 04) 本质上, bash变量是不区分类型的, 都是字符串. 但是依赖于具体的上下文; 05) 无论变量赋值时有没有引号,都会以字符串的形式存储; 06) bash允许 比较操作 和 整数操作. 其中的关键因素就是, 变量中的值是否只有数字; 07) *注意 设置一个变量为null, 与unset这个变量, 并不是一回事 虽然最终的结果相同; 08) 可以在同一行上设置多个变量,但是必须以空白进行分隔; 09) 强烈注意, 在赋值的的时候, 等号前后一定不要有空格; 10) =前后各有空格,是比较关系。没有空格是赋值关系; 11) 如果在变量中存在空白;
If there is whitespace embedded within a variable
# 那么就必须加上引用
'If there is whitespace embedded within a variable'
# 不过也可以采用将空白转义的方法.
If\ there\ is\ whitespace\ embedded\ within\ a\ variable
错误的命名
VARIABLE =value
脚本将尝试运行一个 VARIABLE 的命令, 带着一个 =value 参数.
var1=21 var2=22 var3=$V3
$慎用, 这么做会降低可读性, 并且不可移植.
12) echo 默认会在行尾加换行符,可用 -n 忽略换行符 echo If\ there\ is\ -n dog
运算符
let
# echo ${x}
let x=16+5 #21
let 'x += 5' #26
let 'x *= 5' #130
let 'x /= 5' #26
let 'x = 5 * 9' #45
expr
echo `expr 4 + 5` #9
echo `expr 4 \* 5` #20
条件语句
如果想在同一行上再写一个新的表达式的话, 那么必须使用分号来结束上一句表达式
if [ condition1 ]
then
command
elif [ condition1 ]
command
else
command
fi
true
[ 0 ]
[ 1 ]
[ -1 ]
[ xyz ]
false
[ ]
文件类型判断
-e file //-该文件名是否存在 -f file //-该文件名是否存在 且 是一个文件 [ -f "somefile" ] -s file //-该文件名是否存在 且 为非空白文件 文件长度不为0 -d file //-该文件名是否存在 且 是一个目录 -b file //-该文件名是否存在 且 是block device 块设备(软盘,cdrom等等) -c file //-该文件名是否存在 且 是character device 字符设备(键盘,modem,声卡等等) -S file //-该文件名是否存在 且 为一个Socket文件 -p file //-该文件名是否存在 且 为一个FIFO(pipe)文件 -L file //-该文件名是否存在 且 为一个链接文件 -h file //-文件是软链接,则为真 -t file //-当文件描述符(默认为1)指定的设备为终端时为真
权限判断
-r file //-该文件名是否存在 且 有 可读 权限 -w file //-该文件名是否存在 且 有 可写 权限 -x file //-该文件名是否存在 且 有 可执行 权限 //[ -x "/bin/ls" ]//判断/bin/ls是否存在并有可执行权限 -g set-group-id(sgid)标志到文件或目录上 -u // set-user-id(suid)标志到文件上 -f file //-文件为正规[常规]文件为真 (例如,if [ -f "filename" ]) -O file //-检查file是否存在 且 属当前用户所有 -G file //-检查file是否存在 且 默认组与当前用户相同 -N //-从文件最后被阅读到现在 是否被修改
文件比较
-nt //-检查 file1 是否比 file2 新 -ot //-检查 file1 是否比 file2 旧 -ef //-检查 file1 与 file2 是否为同一个文件,可用在判断 hard link 的判定上 //-判定两个是否都指向同一 inode
数值比较
-eq //—比较两个参数是否相等(例如,if [ 2 –eq 5 ]) -ne //—比较两个参数是否不相等 -gt //—参数1是否大于参数2 -ge //—参数1是否大于等于参数2 -lt //—参数1是否小于参数2 -le //—参数1是否小于等于参数2
判定字符串数据
-z test -z string //- string 为空字符串(null) 则为 true 数字0不为空 -n test -n string //- string 不为空字符串(null)则为 true // [ -n "$var" ]判断$var变量是否有值 = test str1 = str2 //- str1 是否等于 str2, 相等则回传 true [ "$a" = "$b" ] //判断$a和$b是否相等 != test str1 != str2 //- str1 是否不等于 str2 不相等则回传 true < str1 < str2 //- 检查str1是否比str2小 > str1 > str2 //- 检查str1是否比str2大
需要注意的是: < < = > >= //-整数操作中必须加(()) //-字符串比较大于小于号必须转义,即加反斜线。 //-字符串比较的顺序是按ASCII表的顺序的,大写字母比小写字母的值小
多重条件判定
-a //- 所有条件都成立 返回 true test -r file -a -x file -o //- 只要有一个条件成立就返回 true ! //- 取反