两种方式运行
echo $shell
bash //默认是bash解析器
bash + 相对路径/绝对路径
sh是bash的软链接
sh + 相对路径/绝对路径
加权限之后,直接路径执行
常用系统变量
$HOME $PWD $SHELL $USER set:显示当前shell中所有变量
自定义变量
echo A=1
echo $A
1
A=1 //等号左右不能有空格,unset删除变量
readonly B=3
unset A //成功
unset B //不成功
无法进行数值计算,默认都是字符串
echo C=1+1
echo $C
1+1
echo D="I love you"
echo $D
I love you
echo D=I love you
echo $D
error
单引号&双引号
echo ' I love $foo' # 不能转化成变量中的值
I love foo
echo " I love $foo"
I love you
定义全局变量
touch helloworld.sh
vim helloworld.sh
#!/bin/bash
echo " helloworld xxxx"
echo $D
:wq
export D//使其成为全局变量
./helloworld.sh
helloworld xxxx
banzhang love mm
特殊变量
$n: 功能描述:n为数字,$0代表该脚本名称,$1~$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
touch bashbench.sh
vim bashbench.sh
#!/bin/bash
echo " $0 $1 $2 $3"
:wq
bash bashbench.sh banzhang
bashbench.sh banzhang
bash bashbench.sh banzhang love
bashbench.sh banzhang love
bash bashbench.sh banzhang love mm
bashbench.sh banzhang love mm
# :获取输入参数的个数 *:这个变量代表命令行中的所有参数,@:这个变量也代表命令行中所有的参数,不过$@每个参数区分对待
当 @ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。
但是当它们被双引号" "包含时,就会有区别了: "@"仍然将每个参数都看作一份数据,彼此之间是独立的。
[mozhiyan@localhost demo]$ . ./test.sh a b c d
print each param from "$*"
a b c d
print each param from "$@"
a
b
c
d
$?:最后运行的命令的结束代码(返回值)
执行成功返回0,执行不成功返回非0
history | grep find # 查找历史命令含有find的命令
history | tail -10 # 列出历史最后10条命令
echo hello = echo 'hello'
echo $(pwd) 才是对的
shellcheck命令:检查shell脚本的语法
算数运算
- 基本语法
(1) "[运算式]"
(2) expr +, -, *, /, % 加,减, 乘, 除,取余,expr运算之间要有空格
条件判断
文件测试
-d:用于测试是否是目录 -e:测试目录或文件是否存在 -f:测试是不是文件 -r:测试当前的用户是否有读的权限 -w:测试当前用户是否有写的权限 -x:测试当前用户是否具有可执行权限 -L:测试是否为符号链接
-f是测试是否为文件, /dev是目录,所以$?返回值是非0
[root@localhost /] [ -f /dev ]
[root@localhost /] echo $?
1
第二种写法,-x是测试是否有执行的权限,如果返回yes,则说明具有,没有返回值,则说明没有
[root@localhost /] [ -x abc ] && echo yes
yes
整数值比较
-eq:等于 -ne:不等于 -gt:大于 -lt:小于 -le:小于等于 -ge:大于等于
[root@localhost /opt] who | wc -l
如果当前用户大于2位,则提示too many
[root@localhost /opt] [ 'who | wc -l' -gt 2] && echo "too many"
查看内存情况
[root@localhost /opt] free -m
检索名称为mem的内存情况
[root@localhost /opt] free -m | grep -i mem
使用awk来查看mem第四列的信息,并赋值给freemem变量
[root@localhost /opt] freemem=`free -m | grep -i mem | awk '{print $4}' `
[root@localhost /opt][ $freemem -lt 300 ] && echo "警告!当前空闲内存低于300M,当前内存为:${freemem}M"
警告!当前空闲内存低于300M,当前内存为:204M
字符串比较
=:字符串内容相同 !=:字符串内容不同 -z:字符串内容为空
格式1:[ 字符串1 = 字符串2 ] 和 [ 字符串1 != 字符串2 ]
格式2:[ -z 字符串 ]
aw为‘root’
[root@localhost /opt][ $a='root' ] && echo 'yes'
yes
[root@localhost /opt][ $a!='root' ] && echo 'yes'
a为空字符串
[root@localhost /opt][ -z $a ] && echo yes
yes
逻辑测试
-a或&&:逻辑与,“且”的意思(两边需同时成立) -o或||:逻辑或,“或”的意思(如果第一个条件满足,则不需要看第二个条件,直接跳过,如果第一个条件失败,则查看第二条) !:逻辑否
流程语句
if语句
if [ 条件表达式 ];then 程序 fi 或者 if [ 条件表达式 ] then 程序 fi
注意:if后面有空格,中括号两边有空格
case语句
case $变量名 in “值1”) 如果变量的值等于值1,则执行程序1 ;; “值2”) 如果变量的值等于值2,则执行程序2 ;; … *) 以上语句都没有执行的时候,执行这个默认语句 ;; esac
- case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
- 双分号“;;”表示命令序列结束,相当于Java中的break。
- 最后的“*)”表示默认模式,相当于Java中的default。
for循环语句
for((初始值;循环控制条件;变量变换)) do 程序 done
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
#!/bin/bash
for i in $*
do
echo "banzhang xihuan $i"
done
for j in $@
do
echo "banzhang xihuan $j"
done
前一个是将变量看成一个整体,后面是拆分成一个一个
while循环语句
#!/bin/bash
s=0
i=1
while[ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
read控制台输入
-p:指定相关的提示符 -t:指定等待时间
#!/bin/bash
read -t 7 -p "Enter your name" NAME
echo $NAME
bash xxx.sh
Enter your name banzhang
banzhang