Shell不但是一个命令行解释器,接收应用程序/用户命令,然后调用操作系统内核。还是一个编程语言
查看提供的shell解释器
[root@bigdata001 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
[root@bigdata001 ~]#
其实都是指向/bin/bash
下面方式执行hello.sh,会再启动一个子shell进行sh文件的执行。可能获取不到当前shell的环境变量
方式一(不需要+x权限):bash hello.sh
方式二(需要+x权限):./hello.sh
下面方式执行hello.sh,会在当前shell进行sh文件的执行
方式三:source hello.sh或 . hello.sh
输入bash会进入一个子shell
[root@bigdata001 ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 17986 17983 0 12:35 pts/0 00:00:00 -bash
root 18266 17986 0 12:38 pts/0 00:00:00 ps -f
[root@bigdata001 ~]#
[root@bigdata001 ~]# bash
[root@bigdata001 ~]#
[root@bigdata001 ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 17986 17983 0 12:35 pts/0 00:00:00 -bash
root 18272 17986 0 12:38 pts/0 00:00:00 bash
root 18319 18272 0 12:38 pts/0 00:00:00 ps -f
[root@bigdata001 ~]#
[root@bigdata001 ~]# exit
exit
[root@bigdata001 ~]#
$HOME、$PWD、$SHELL、$USER等
可以使用env或printenv命令查看所有全局系统变量。也可以查看某个全局系统变量
[root@bigdata001 ~]# printenv USER
root
[root@bigdata001 ~]#
可以使用set命令查看所有全局、局部系统变量和用户自定义变量
基本语法
readonly my_var=6
变量定义规则
my_var=$((1+5))
或my_var=$[1+5]
注意:通过变量名=变量值
定义的变量,只能在当前shell访问,不能在子shell访问。想要在子shell访问,需要export 变量名
。但是在子shell进行export,父shell是访问不了的
示例如下:
[root@bigdata001 ~]# cat test.sh
#!/usr/bin/sh
echo $0
echo "hello $1"
[root@bigdata001 ~]#
[root@bigdata001 ~]# sh ./test.sh li_si
./test.sh
hello li_si
[root@bigdata001 ~]#
统计脚本参数个数
示例如下:
[root@bigdata001 ~]# cat test.sh
#!/usr/bin/sh
echo '=============$*============'
for i in "$*"
do
echo $i
done
echo '=============$@============'
for i in "$@"
do
echo $i
done
[root@bigdata001 ~]# sh test.sh a b c
=============$*============
a b c
=============$@============
a
b
c
[root@bigdata001 ~]#
查看上一个命令执行的返回状态。执行正常返回状态为0,执行非正常返回状态为非0
[root@bigdata001 ~]# cat test.sh
#!/usr/bin/sh
no_command
echo $?
[root@bigdata001 ~]#
[root@bigdata001 ~]# sh ./test.sh
./test.sh:行3: no_command: 未找到命令
127
[root@bigdata001 ~]#
[root@bigdata001 ~]# echo $?
0
[root@bigdata001 ~]#