shell 命令解释器

用户使用的shell终端不同那shell语法也不同

!/bin/bash 申明shell运行环境


用户自定义变量 只在当前shell中生效


name=abcd
name=$(date) echo系统变量和赋值系统变量都需要使用$()
name=$var$var13123 多个变量连接和字符增加
set 查看系统所有变量
unset 变量名 删除变量

位置参数变量 接收参数


变量作用 描述
$n $0代表命令的本身,$1代表第一个参数
#!/bin/bash
echo $0;
echo $1;
echo $2;
[root@localhost sh]# ajax start abc adc
/root/sh/ajax
start
abc
变量作用 描述
$* 代表所有的参数变量,但是把所有参数看成一个整体
$@ 代表所有的参数变量,把所有参数单独对待,for in
#!/bin/bash
echo '*:'$*;
echo '@:'.$@;
[root@localhost sh]# ajax start abc adc
*:start abc adc
@:start abc adc
变量作用 描述
$# 参数的总数
#!/bin/bash
echo $#;
[root@localhost sh]# ajax start abc adc
3

预定义变量


变量作用 描述
$? 获取上次命令是否执行成功,0代表成功
$$ 获取当前进程pid
$! 后台运行的最后一个进程号

接收键盘输入 read


变量作用 描述
-p 等待用户输入时输出的提示信息
-t 等待用户输入的时间,单位为秒
-s 隐藏用户输入的信息
-n 接收到指定的字符数就会直接执行
#!/bin/bash
read -t 30 -p '请输入你的用户名: ' name;
echo $name;
read -t 30 -s -p '请输入你的密码: ' pass;
echo -e "\n"$pass;
read -n 1 -p '你已经确定要登陆了吗?[y/n]: ' sub
echo -e "\n"$sub;

cut 字符截取命令,通常与grep搭配,有明确的分割符的时候使用


变量作用 描述
-d 分割符号
-f 第几列
[root@localhost sh]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
chrony:x:997:996::/var/lib/chrony:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nginx:x:1000:1000::/home/nginx:/bin/bash

列出当前系统可登陆的用户,-v是取反

[root@localhost ~]# cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f 1
nginx
[root@localhost ~]#

awk 字符截取命令,通常与grep搭配,在分割符是空格的时候,使用awk,默认识别空格和制表符


[root@localhost sh]# df -h
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root  6.7G 1005M  5.8G   15% /
devtmpfs               491M     0  491M    0% /dev
tmpfs                  498M     0  498M    0% /dev/shm
tmpfs                  498M  6.6M  491M    2% /run
tmpfs                  498M     0  498M    0% /sys/fs/cgroup
/dev/sda1              497M   97M  401M   20% /boot
获取指定硬盘设备的占用百分比
[root@localhost ~]# df -h | grep rhel-root | awk ‘{print $5}’ | cut -d "%" -f 1
15
为什么要用awk?因为字符串分割是通过空格。
print $5 是什么意思? 第5列

判断文件类型和权限判断


选项 描述
-d 判断该文件是否存在,而且是否为目录文件
-e 判断该文件是否存在
-f 判断该文件是否存在,而且是否为普通文件
[root@localhost ~]# [ -d sh ] 必须有这空格分开
[root@localhost ~]# echo $?
0

[ -d sh ] && ([ -r sh ] && echo "没有读的权限" ||) echo "  读的权限") || echo '不是一个目录'

ls -ld sh | awk '{print substr($1,4,1)}' 通过字符串截取,得到权限标识符

1 && echo 'true' || echo 'false' 这一句应该怎么理解?
1 ? true : false; 这样好理解吧?

字符串比较和数值比较


选项 描述 示例
-z 判断字符串是否为空(为空返回真) [ -z 'string' ]
-n 判断字符串是否为空(为空返回假) [ -n 'string' ]
-gt 两个数值比较 [ num1 -gt num2 ]
-lt 两个数值比较 [ num1 -gt num2 ]

条件判断


选项 描述 示例
-a and [ 1 -gt 1 -a 1 -gt 1 ]
-o or [ 1 -gt 1 -o 1 -gt 1 ]
== [ num1 == num2 ]
!= 不等于 [ !num1 != num2 ]

if语句


     1    #!/bin/bash
     2    read -p '请输入密码: ' pass
     3    if [ $pass == '578115zyy' ]
     4        then
     5          echo '恭喜你答对了哟';
     6        else
     7          echo '密码错了,好好检查一下';
     8    fi

case语句


#!/bin/bash
read -p '请输入一个字符串,yes/no ' param
case $param in
    yes)
        echo -e '\r\n你输的是yes'
        ;;
    no)
       echo -e '\r\n你输入的是no'
       ;;
    *)
        echo -e '\r\n你不按套路出牌'
esac

for for in语句


#!/bin/bash
for i in ~/*
    do
        echo $i;
    done
for i in 1 2 3 4
    do
        echo $i;
    done
s=0;
for((i=0;i<=100;i++))
    do
       s=$[$s+$i];
       echo $i;
    done
echo $s;

results matching ""

    No results matching ""