文件头
#!/bin/sh
''、""、``
'' 表示字符串
"" 引用变量
`` 可以使用命令
$ x=5
$ echo '$x'
$x
$ echo "$x"
5
$ date
2018年 2月18日 星期日 10时58分51秒 CST
$ date_val=`date`
$ echo "$date_val"
2018年 2月18日 星期日 11时00分58秒 CST
变量
自定义变量
$ x=5
$ echo $x
5
#定义变量不要加空格,不然会被当成命令
$ x = 5
-bash: x: command not found
变量追加
$ x=123
$ x="$x"456
$ echo $x
123456
$ x=${x}789
$ echo $x
123456789
定义环境变量
$ export x=1
$ env | grep x=1
x=1
$ y=1
$ export y
$ env | grep y=1
y=1
环境变量与局部变量
pstree:查看进程树。环境变量是全局的,不论在子shell还是父shell,而用户自定义变量只在局部。
$ bash
$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─......
├─sshd───sshd───sshd───bash───bash───pstree
├─.......
$ export global_val=1
$ local_val=1
$ set
......
global_val=1
local_val=1
#进入子shell查看变量
$ bash
$ set
......
global_val=1
系统变量:PS1
$ echo $PS1
\h:\W \u\$
位置参数与预定义变量
位置参数变量 | 解释 |
---|---|
$n | n为数字。$0表示命令本身,$1...$9表示参数,10及以上要用大括号:${10} |
$# | 参数个数 |
$* | 代表命令所有参数,将命令所有参数当成一个整体 |
$@ | 代表命令所有参数,将命令每个参数区别对待 |
预定义变量 | 解释 |
---|---|
$? | 最后一次执行的命令的返回状态。正常返回0,非0不正常执行。 |
$$ | 当前进程的PID |
$! | 后台运行的最后一个进程的PID |
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
echo $sum
执行
./param1.sh 20 30
50
#!/bin/bash
echo "------------------"
echo "\$#: $#"
echo "------------------"
for i in "$*"
do
echo "\$*: $i"
done
echo "------------------"
for j in "$@"
do
echo "\$@: $j"
done
#./param2.sh 2 3 45 6
#输出结果:
------------------
$#: 4
------------------
$*: 2 3 45 6
------------------
$@: 2
$@: 3
$@: 45
$@: 6
$ echo "$?"
0
$ l
-bash: l: command not found
$ echo "$?"
127
$ echo $$
913
$ ps aux | grep 913
baozi 913 0.0 0.0 4300352 1640 s001 S 2:14下午 0:00.04 -bash
baozi 981 0.0 0.0 4267768 888 s001 S+ 2:21下午 0:00.00 grep 913
运算符
一、使用declare
$ aa=11
$ bb=22
$ declare -i cc=$aa+$bb
$ echo $cc
33
$ declare -p cc
declare -i cc="33"
二、expr expr运算的时候注意+左右的空格
$ aa=11
$ bb=22
$ cc=$(expr $aa+$bb)
$ echo $cc
11+22
$ cc=$(expr $aa + $bb)
$ echo $cc
33
三、$(( 表达式 ))、$[ 表达式 ]
$ aa=11
$ bb=22
$ cc=$(( $aa+$bb ))
$ echo $cc
33
$ cc=$(( $aa + $bb ))
$ echo $cc
33
$ cc=$[ $aa + $bb ]
$ echo $cc
33
$ cc=$[ $aa+$bb ]
$ echo $cc
33
四、let
$ aa=11
$ bb=22
$ let cc=$aa+$bb
$ echo $cc
33
$ let cc=$aa + $bb
-bash: let: +: syntax error: operand expected (error token is "+")
变量测试符号
变量置换方式 | 变量y没有设置 | 变量y为空值 | 变量y设置值 |
---|---|---|---|
x=${y-新值} | x=新值 | x为空 | x=$y |
x=${y:-新值} | x=新值 | x=新值 | x=$y |
x=${y+新值} | x为空 | x=新值 | x=新值 |
x=${y:+新值} | x为空 | x为空 | x=新值 |
x=${y=新值} | x=新值 y=新值 |
x为空 y值不变 |
x=$y y值不变 |
x=${y:=新值} | x=新值 y=新值 |
x=新值 y=新值 |
x=$y y值不变 |
x=${y?新值} | 新值输出到标准错误输出(就是屏幕) | x为空 | x=$y |
x=${y:?新值} | 新值输出到标准错误输出(就是屏幕) | 新值输出到标准错误输出(就是屏幕) | x=$y |
流程控制
判断文件类型
测试选项 | 作用 |
---|---|
-d | 判断文件是否存在且为目录 |
-f | 判断文件是否存在且为普通文件 |
-e | 文件是否存在 |
-b | 判断文件是否存在且为块设备文件 |
-c | 判断文件是否存在且为字符设备文件 |
-L | 判断文件是否存在且为符号链接文件 |
-p | 判断文件是否存在且为管道文件 |
-s | 判断文件是否存在且非空 |
-S | 判断文件是否存在且为套接字文件 |
示例:注意中括号左右要加空格
$ [-e some_passwd] && echo "yes" || echo "no"
-bash: [-e: command not found
no
$ [ -e some_passwd] && echo "yes" || echo "no"
-bash: [: missing `]'
no
$ [ -e some_passwd] && echo "yes" || echo "no"
yes
判断文件权限
测试选项 | 作用 |
---|---|
-r | 判断文件是否存在且拥有读权限 |
-w | 判断文件是否存在且拥有写权限 |
-x | 判断文件是否存在且拥有执行权限 |
-u | 判断文件是否存在且拥有SUID权限 |
-g | 判断文件是否存在且拥有SGID权限 |
-k | 判断文件是否存在且拥有SBit权限 |
文件之间比较
测试选项 | 作用 |
---|---|
文件1 -nt 文件2 | 判断文件1的修改时间是否比文件2的新。new time |
文件1 -ot 文件2 | 判断文件1的修改时间是否比文件2的旧。old time |
文件1 -ef 文件2 | 两个文件是否为同一个文件。equal file |
$ ln some_passwd hard_some_passwd
$ ln -s some_passwd soft_some_passwd
$ ls -li
4298176865 -rw-r-xr-x 2 baozi staff 130 2 19 16:40 hard_some_passwd
4298189532 lrwxr-xr-x 1 baozi staff 11 2 19 18:52 soft_some_passwd -> some_passwd
4298176865 -rw-r-xr-x 2 baozi staff 130 2 19 16:40 some_passwd
$ [ some_passwd -ef hard_some_passwd ] && echo "yes" || echo "no"
yes
$ [ some_passwd -ef soft_some_passwd ] && echo "yes" || echo "no"
yes
整数比较
测试选项 | 作用 |
---|---|
整数1 -eq 整数2 | 等于。equal |
整数1 -ne 整数2 | 不等于。not equal |
整数1 -gt 整数2 | 大于。gleater than |
整数1 -lt 整数2 | 小于。less then |
整数1 -ge 整数2 | 大于等于。gleater or equal |
整数1 -le 整数2 | 小于等于。less or equal |
$ [ 20 -eq 20 ] && echo yes || echo no
yes
字符串比较
测试选项 | 作用 |
---|---|
-z 字符串 | 判断为空。 |
-n 字符串 | 判断非空。 |
字符串1 == 字符串2 | 判断字符串相等。 |
字符串1 != 字符串2 | 判断字符串不等。 |
$ name="a"
$ [ -n $name ] && echo yes || echo no;
yes
$ name2="a"
$ [ $name == $name2 ] && echo yes || echo no;
yes
逻辑运算符
测试选项 | 作用 |
---|---|
-a | 逻辑与 |
-o | 逻辑或 |
! | 逻辑非 |
判断语句:if
if写法1
#!/bin/bash
cur_user=$(env | grep "^USER=" | cut -d "=" -f 2)
if [ "$cur_user" == "baozi" ]
then
printf '%s\n' $cur_user
fi
if写法2:其实就是让if和then在同一行,所以要加一个结尾符";"
#!/bin/bash
cur_user=$(env | grep "^USER=" | cut -d "=" -f 2)
if [ "$cur_user" == "baozi" ] ; then
printf '%s\n' $cur_user
fi
if else
#!/bin/bash
read -p "input the dir:" dir
if [ -d "$dir" ] ; then
printf '%s\n' "是个目录"
else
printf '%s\n' "不是目录"
fi
多重if
#!/bin/bash
#提取后缀
read -p "input the filename:" filename
if [ -z "$filename" ] ; then
echo "please input the filename"
exit 1
fi
suffix=${filename##*\.}
if [ $suffix == "txt" ] ; then
printf '%s\n' "文件类型为txt"
elif [ $suffix == "sh" ] ; then
printf '%s\n' "文件类型为sh"
else
echo "其他文件类型"
fi
判断语句:case
#!/bin/bash
read -p "输入yes或者no:" cho
case "$cho" in
"yes")
echo "yes"
;;
"no")
echo "no"
;;
*)
echo "other"
;;
esac
循环语句:for
#!/bin/bash
for i in 1 2 3 4 5
do
echo $i
done
#!/bin/bash
for i in `seq 1 1000`
do
echo $i
done
#!/bin/bash
s=0
for (( i=1;i<=100;i++ ))
do
let s=$s+$i
done
echo $s
循环语句:while
#!/bin/bash
i=1
s=0
while [ $i -le 100 ]
do
let s=$s+$i
let i=i+1
done
echo $s
循环语句:util
与while相反,条件成立退出,不成立一直循环
网友评论