read -p :提示符
声明变量,declare -i total=$firstnu*$secnu ; //表明是数值型,否则默认是字符串
可以使用var = $(( 运算内容 ))来计算,如echo $(( 13 % 3 )), 小括号内可以有空格,$与(必须挨着
script的执行方式区别:
1 直接执行:./shxx.sh,当前的bash生成一个子进程,然后shell文件在子进程内运行,所以程序中设置的变量父进程不可见
2 source脚本:在父进程中执行,共享变量,如下图
判断一个文件是否存在
ls xlf && echo "exist" || echo "not exist"
test -e xlf && echo "exist" || echo "not exist"
以上执行正确
如果是以下则出现问题
ls xlf || echo "not exist" && echo "exist"
因为 && 与 || 的执行条件如下:
所以对于ls xlf || echo "not exist" && echo "exist" : 首先如果xlf不存在,则ls xlf返回非0,||后 echo "not exist"执行,返回0,因为它返回0,所以 &&执行输出echo "exist".要注意顺序,一般是 && 再 ||
测试的条件判断:
以下练习scripts:
#/bin/bash
#输入用户名,判断文件是否存在,不存在输出信息,程序退出
#若存在,则输出是文件还是目录
#再判断以下,执行者的身份对这个文件或目录所拥有的权限,并输出权限数据
read -p "please input a filename: " filename
test -z $filename && echo "You must input a filename." && exit 0;
test ! -e $filename && echo "not exist" && exit 0
test -f $filename && echo "$filename is a regular file"
test -d $filename && echo "$filename is a directory"
test -r $filename && echo "$filename is readalbe"
test -w $filename && echo "$filename is writeable"
test -x $filename && echo "$filename is execable"
利用中括号也可以进行判断 : [ _"$xxx" _==_ "$xxx"_], _表示空格,中括号两端需要有空格符来分割,上面test所有的判断规则都可以适用,常用在if...then...fi中,使用时需要注意如下内容:
1 在中括号[]内的每个组件都需要有空格键来分割
2 在中括号内的变量,最好以双引号括起来
3 在中括号内的常量,最好以单引号或双引号括起来。
如下例子:
#/bin/bash
#让程序输入y或n,对于两种情况分别输出提示信息,
#利用[]进行判断,如果不是Y/y/N/n,则显示错误
read -p "please input(Y(y) or N(n)): " response
[ "$response" == 'Y' -o "$response" == 'y' ] && echo "OK continue" && exit 0
[ "$response" == 'N' -o "$response" == 'n' ] && echo "Oh, interrupt!" && exit 0
echo "I don;t know what your choice is" && exit 0
shell script的默认变量
$0:程序名,$1:第1个参数 $2:第2个参数....
$#: 代表后接的参数个数
$@: 代表“$1” “ $2” “ $3” “$4”,全部的变量,每个变量是独立的,
$*: 代表“ “$1c$2c$3c$4” ” , c表示的分割符,默认是空格,也是全部的变量,
以下使用例子:
#/bin/bash
#执行脚本后显示程序名,共有几个参数,若参数个数小于2,则参数太少,然后输出全部参数内容
echo "脚本名称:$0"
echo "总共$#个参数"
[ $# -lt 2 ] && echo "参数太少" && exit 0
echo "全部参数:$@ $*"
echo "第一个参数:$1"
echo "第二个参数:$2"
shift: 造成参数变量号码右移,如下:
#/bin/bash
#执行脚本后显示程序名,共有几个参数,显示shift的功能
echo "脚本名称:$0"
echo "总共$#个参数"
echo "全部参数:$@ "
shift #进行一次变量向右移动
echo "总共$#个参数"
echo "全部参数:$@ "
shift 3 #变量向右移动三个
echo "总共$#个参数"
echo "全部参数:$@ "