算术运算
shell的算术运算真是奇怪,必须要加双括号,若引用但括号会有bug
let命令的替代表示形式是:
((算术表达式)) 或 [算术表达式]
如下面代码:
i=2
j=3
k=0
let "k=i+j"
echo $k
echo $(i+j)
echo $[i/j]
一定要换为$((i+j))
才行。
还有 let "k=i+j"
的双引号要不要效果一样
中括号可能忽略空格
下面的代码就是左边的中括号与里面内容之间缺少括号而导致的错误
m -rf /home/tom/cdt
dir=/home/tom/cdt
[!-e$dir ]&& mkdir $dir
正确的代码是:
m -rf /home/tom/cdt
dir=/home/tom/cdt
[ !-e$dir ]&& mkdir $dir
条件测试语句
格式1: test 测试表达式
格式2: [ 测试表达式 ]
格式3: [[ 测试表达式 ]] (bash 2.x 版本以上)
在 [[ ]] 中可以使用通配符进行模式匹配
奇怪的case
echo -n "Do you agree with this? [yes or no]: "
read yn
case $yn in
[Yy] | [Yy][Ee][Ss] ) echo "Agree." ;;
[Nn] | [Nn][Oo] )
echo "Not agree"
exit 1
;;
*) echo " Invalid input. " ;;
esca
一个复杂的while例子
先上代码和结果
# 找到当前目录下包含空格的文件,将空格替换成下划线
DIR="."
find $DIR -type f | while read file;do
if [[ "$file" == *[[:space:]]* ]]; then
mv "$file" $(echo "$file" | tr ' ' '_')
fi
done
查当前目录下的所有普通文件:
find . -type f
通过管道 ‘|’ 把列出的当前行find到的所有文件名赋值给read命令后的变量file变量:
find $DIR -type f | while read file
将文件名的空格换为”_”:
echo "$file" | tr ' ' '_'
select
select variable in list
do # 循环开始的标志
commands # 循环变量每取一次值,循环体就执行一遍
done # 循环结束的标志
如:
select var in "Linux" "Gnu Hurd" "Free BSD" "Other";
do
echo "You have select $var"
done
select 是个无限循环
通常要配合 case 语句处理不同的选单及退出
select 循环的退出
按 ctrl+c 退出循环
在循环体内用 break 命令退出循环
或用 exit 命令终止脚本