参考:linux shell脚本基础知识
Table of Contents
1、用户自定义变量
1.1变量赋值:
1.2, 将一个命令的执行结果赋给变量
1.3变量叠加
1.4、列出所有的变量:
1.5、删除变量:
2、环境变量
3、位置参数变量
3.1、shift指令:
3.2、shell中$* 和$@的区别
4、预定义变量
5、read命令
6、运算符
7、$()与${}的区别
8、条件测试
8.1、内置test命令
8.2、字符串测试:
8.3、整数测试:
8.4、多重条件测试:
9、case命令
1,定义时赋值:
变量=值
等号两侧不能有空格
eg:
STR="hello world"
A=9
A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
A=$(ls -la) 等价于反引号
eg: aa=$((4+5))
bb=`expr 4 + 5 `
eg:#aa=123
eg:#cc="$aa"456
eg:#dd=${aa}789
单引号和双引号的区别:
现象:单引号里的内容会 全部输出,而双引号里的内容会有变化
原因:单引号会将所有特殊字符脱意
NUM=10
SUM="$NUM hehe" echo $SUM 输出10 hehe
SUM2='$NUM hehe' echo $SUM2 输出$NUM hehe
# set
# unset NAME
eg :
# unset A 撤销变量 A
# readonly B=2 声明静态的变量 B=2 ,不能 unset
用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和其所有子shell中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效。
export 变量名=变量值
作用域:当前shell以及所有的子shell
$n | n为数字,$0代表命令本身,$1-$9代表第一到第9个参数, 十以上的参数需要用大括号包含,如${10}。 |
$* | 代表命令行中所有的参数,把所有的参数看成一个整体。以"$1 $2 … $n"的形式输出所有参数 |
$@ | 代表命令行中的所有参数,把每个参数区分对待。以"$1" "$2" … "$n" 的形式输出所有参数 |
$# | 代表命令行中所有参数的个数。添加到shell的参数个数 |
位置参数可以用shift
命令左移。比如shift 3
表示原来的$4
现在变成$1
,原来的$5
现在变成$2
等等,原来的$1
、$2
、$3
丢弃,$0
不移动。不带参数的shift
命令相当于shift 1
。
若用户要求 Shell 在不知道位置变量个数的情况下,还能逐个的把参数一一处理,也就是在 $1 后为 $2,在 $2 后面为 $3 等。在 shift 命令执行前变量 $1 的值在 shift 命令执行后就不可用了。
示例如下:
#测试 shift 命令(x_shift.sh)
until [ $# -eq 0 ]
do
echo "第一个参数为: $1 参数个数为: $#"
shift
done
执行以上程序x_shift.sh:
$./x_shift.sh 1 2 3 4
结果显示如下:
第一个参数为: 1 参数个数为: 4
第一个参数为: 2 参数个数为: 3
第一个参数为: 3 参数个数为: 2
第一个参数为: 4 参数个数为: 1
从上可知 shift 命令每执行一次,变量的个数($#)减一,而变量值提前一位,下面代码用 until 和 shift 命令计算所有命令行参数的和。
参考:https://www.cnblogs.com/tele-share/p/9080069.html
#! /bin/bash
test() {
echo "未加引号,二者相同"
echo $*
echo $@
echo "加入引号后对比"
for N in "$*"
do
echo $N
done
echo "----------"
for N in "$@"
do
echo $N
done
}
test 12 123 3424 546
可以看到不加引号时,二者都是返回传入的参数,但加了引号后,此时$*把参数作为一个字符串整体(单字符串)返回,$@把每个参数作为一个字符串返回
$? |
执行上一个命令的返回值 执行成功,返回0,执行失败,返回非0(具体数字由命令决定) |
$$ |
当前进程的进程号(PID),即当前脚本执行时生成的进程号 |
$! |
后台运行的最后一个进程的进程号(PID),最近一个被放入后台执行的进程 & |
# vi pre.sh
pwd >/dev/null
echo $$
ls /etc >/dev/null &
echo $!
Linux文件默认是没有x权限的 而文件是有的
read [选项] 值
read -p(提示语句) -n(字符个数) -t(等待时间,单位为秒) –s(隐藏输入) 对应密码那些输入
eg:
read –t 30 –p “please input your name: ” NAME
echo $NAME
read –s –p “please input your age : ” AGE
echo $AGE
read –n 1 –p “please input your sex [M/F]: ” GENDER
echo $GENDER
按住Ctrl +退格 才可以退
num1=11
num2=22
sum=$num1+$num2
echo $sum
格式 :expr m + n 或$((m+n)) 注意expr运算符间要有空格
expr命令:对整数型变量进行算术运算
(注意:运算符前后必须要有空格)
expr 3 + 5
expr 3 – 5
echo `expr 10 / 3`
10/3的结果为3,因为是取整
expr 3 \* 10
\ 是转义符
计算(2 +3 )×4 的值
1 .分步计算
S=`expr 2 + 3`
expr $S \* 4
2.一步完成计算
expr `expr 2 + 3` \* 4
S=`expr \`expr 2 + 3\` \* 4`
echo $S
或
echo $(((2 + 3) * 4))
$( )的用途和反引号``一样,用来表示优先执行的命令
eg:echo $(ls a.txt)
${ } 就是取变量了 eg:echo ${PATH}
$((运算内容)) 适用于数值运算
eg: echo $((3+1*4))
内置test命令常用操作符号[]表示,将表达式写在[]中,如下:
[ expression ] 注意空格
或者:
test expression
注意:expression首尾都有个空格
eg: [ ] ;echo $?
测试范围:整数、字符串、文件
表达式的结果为真,则test的返回值为0,否则为非0。
当表达式的结果为真时,则变量$?的值就为0,否则为非0
test str1 == str2 测试字符串是否相等 =
test str1 != str2 测试字符串是否不相等
test str1 测试字符串是否不为空,不为空,true,false
test -n str1 测试字符串是否不为空 注意str1加双引号和不加的区别
test -z str1 测试字符串是否为空
eg:
name=linzhiling
[ “$name” ] && echo ok
; 命令连接符号
&& 逻辑与 条件满足,才执行后面的语句
[ -z “$name” ] && echo invalid || echo ok
|| 逻辑或,条件不满足,才执行后面的语句
test “$name” == ”yangmi” && echo ok || echo invalid
test int1 -eq int2 测试整数是否相等 equals
test int1 -ge int2 测试int1是否>=int2
test int1 -gt int2 测试int1是否>int2
test int1 -le int2 测试int1是否<=int2
test int1 -lt int2 测试int1是否
eg:
test 100 –gt 100
test 100 –ge 100
如下示例两个变量值的大小比较:
-gt表示greater than大于的意思,-le表示less equal表示小于等于。
文件测试:
test -d file ;echo $? 指定文件是否目录
test –e file ;echo $? 文件是否存在 exists
test -f file ;echo $? 指定文件是否常规文件
test –L File ;echo $? 文件存在并且是一个符号链接
test -r file 指定文件是否可读
test -w file 指定文件是否可写
test -x file 指定文件是否可执行
eg:
test -d install.log
test –r install.log
test –f xx.log ; echo $?
[ -L service.soft ] && echo “is a link”
test -L /bin/sh ;echo $?
[ -f /root ] && echo “yes” || echo “no”
条件1 –a 条件2 逻辑与 两个都成立,则为真
条件1 –o 条件2 逻辑或 只要有一个为真,则为真
! 条件 逻辑非 取反
eg:
num=520
[ -n “$num” –a “$num” –ge 520 ] && echo “marry you” || echo “go on”
age=20
pathname=outlog
[ ! -d“$ pathname”] && echo usable || echo used
case变量的值用来匹配value1,value2,value3等等。匹配到后则执行跟在后面的命令直到遇到双分号为止(;;)case命令以esac作为终止符。
#!/bin/bash
case $1 in
start)
echo "starting"
;;
Stop)
echo "stoping"
;;
*)
echo "Usage: {start|stop}"
esac