Shell

0 阅读2分钟

image.png image.png

两种方式运行

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 image.png

history | grep find # 查找历史命令含有find的命令
history | tail -10 # 列出历史最后10条命令
echo hello = echo 'hello'
echo $(pwd) 才是对的

shellcheck命令:检查shell脚本的语法

算数运算

  1. 基本语法 (1) "((运算式))""((运算式))"或"[运算式]" (2) expr +, -, *, /, % 加,减, 乘, 除,取余,expr运算之间要有空格 image.png

image.png

条件判断

文件测试

-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

  1. case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
  2. 双分号“;;”表示命令序列结束,相当于Java中的break。
  3. 最后的“*)”表示默认模式,相当于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