由于前一段搭了一个内网的Linux服务器,可是当我想要安装一些镜像的时候才意识到根本没有网络,所以只好写一个shell脚本进行模拟常规的网关登陆,从而将内网服务器联网。同时在学习shell的时候发现网上的一些博客存在错误,于是乎这就是我想借这个小demo进行shell总结的初衷。
在shell脚本的一开始我们要写入幻数(magic number)#!/bin/sh
这是为什么呢?
- #!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后⾯跟的是解释此脚本的shell的路径;
- 其实第⼀句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本;
- 比如说/bin/csh脚本,/bin/perl脚本,/bin/awk脚本,/bin/sed脚本,甚至/bin/echo等等;
在运行时我们可以采用两种方式:
- 使用命令:
sh + xxx.sh
即可完成执行,此时不需要更改该文件的权限; - 使用
chmod +x xxx.sh
命令先赋予该文件可执行权限,然后./xxx.sh
执行;
-
创建变量
脚本语言中的变量是赋值的时候创建的,创建好后加入集合set中。变量定义时不加
$
符号HELLO="hello world" ##注意:等号两端都不可有空格!!
-
查看与删除变量
创建好上述变量后,该变量将保存在set中,可用
set|grep HELLO
命令进行查看,而若想删除该变量则可以使用unset HELLO
; -
输出变量
输出主要分以下几种方式:
echo ${HELLO} echo $HELLO echo ${HELLO:0:5} #第一个冒号后数字表示字符串串起点下标,第二个冒号后数字表示从起点开始的长度 echo ${HELLO:2} #打印从第2字符个开始到最后 echo ${HELLO::2} #打印从第0个开始到第2个字符是
-
一些特殊的符号
- $$:显示PID;
- $?:显示上一条命令的执行结果,返回结果只能是0
255间的整数,0为成功,1255为相应的错误;可用$?
来查看编写函数的返回值,如果超过255则会轮回; - $#:参数的个数;
- $0:当前脚本的文件名;
- $n:第n个参数,n从1开始;
-
变量间的组合
echo ${HELLO}${HELLO1} echo ${HELLO}"abcde"${HELLO1}
-
设置环境变量量的三种方法:
-
在文件
/etc/profile
文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”;vi /etc/profile export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行
# source /etc/profile
,不然只能在下次重进此用户时生效; -
在用户目录下的
.bash_profile
文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”;export CLASSPATH=./JAVA_HOME/lib; $JAVA_HOME/jre/lib
注:修改文件后要想马上生效还要运行
# source /home/guok/.bash_profile
,不然只能在下次重进此用户时生效; -
直接运行export命令定义变量,只对当前shell有效“临时的”;
在shell的命令行下直接使用
export 变量名=变量值
来定义变量,该变量只在当前的shell或其子shell 下是有效的,shell关闭了,变量也就失效了,再打开新shell时没有这个变量,需要使用的话还需要再重新定义。
-
-
输出环境变量:
-
既可以直接
echo 变量名
; -
又可以使用
env
命令进行查看全部环境变量(env
是set
的子集);
-
-
foreach循环
for i in 1 3 5 7 9 do echo $i done
-
for循环
for((i=0;i<10;i++)) do echo $i done
-
while循环
while <condition>; do <stmts> done
-
until循环
until <condition>; do <stmts> done
-
if - then - else
if [ '$1' –lt '0' ]; then echo "Error: invalid grade" elif [ '$1' –lt '60' ] ; then echo 'no pass' elif [ '$1' –lt '70' ] ; then echo "pass" elif [ '$1' –lt '80' ] ; then echo 'good' elif [ '$1' –le '100' ] ; then echo 'excellent' else echo'Error: invalid grade' fi
-
case
#!/bin/sh echo –n "Do you want to continue this operation? [n]" read yesno case $yesno in y | Y | Yes | yes) echo "system will continue this operation" ;; n | N | no | NO) echo "system will skip this operation" ;; *) echo "Incorrect input" exit 1 ;; esac