linux shell脚本之-变量极速入门与进阶(1)
1,如果创建shell脚本?
使用任意文本编辑软件,一般为vim,创建.sh结尾的文件,在文件的最开头用 #!/bin/bash 注明shell的类型
如:
ghostwu@dev:~/linux/shell$ cat how_to_use_shell.sh #!/bin/bash ls /
2,如何执行shell?
>把shell文件当做bash的命令行参数
ghostwu@dev:~/linux/shell$ ls -l total 4 -rwxrwxr-x 1 ghostwu ghostwu 17 5月 28 18:14 how_to_use_shell.sh ghostwu@dev:~/linux/shell$ bash how_to_use_shell.sh backup cdrom home lib64 mnt proc sbin sys var bin dev initrd.img lost+found opt root snap tmp vmlinuz boot etc lib media patch run srv usr www ghostwu@dev:~/linux/shell$ /bin/bash how_to_use_shell.sh backup cdrom home lib64 mnt proc sbin sys var bin dev initrd.img lost+found opt root snap tmp vmlinuz boot etc lib media patch run srv usr www ghostwu@dev:~/linux/shell$ bash ~/linux/shell/how_to_use_shell.sh backup cdrom home lib64 mnt proc sbin sys var bin dev initrd.img lost+found opt root snap tmp vmlinuz boot etc lib media patch run srv usr www
ghostwu@dev:~/linux/shell$ sh how_to_use_shell.sh backup cdrom home lib64 mnt proc sbin sys var bin dev initrd.img lost+found opt root snap tmp vmlinuz boot etc lib media patch run srv usr www
>给shell文件添加可执行权限,我这里已经添加过了,使用命令( chmod a+x 脚本文件路径 )
ghostwu@dev:~/linux/shell$ ./how_to_use_shell.sh backup cdrom home lib64 mnt proc sbin sys var bin dev initrd.img lost+found opt root snap tmp vmlinuz boot etc lib media patch run srv usr www ghostwu@dev:~/linux/shell$ ~/linux/shell/how_to_use_shell.sh backup cdrom home lib64 mnt proc sbin sys var bin dev initrd.img lost+found opt root snap tmp vmlinuz boot etc lib media patch run srv usr www ghostwu@dev:~/linux/shell$
3,单双引号跟php是一样的,单引号不解释变量,双引号会解释变量
ghostwu@dev:~/linux/shell$ echo "learning shell program with ghostwu" learning shell program with ghostwu ghostwu@dev:~/linux/shell$ echo 'learning shell program with ghostwu' learning shell program with ghostwu ghostwu@dev:~/linux/shell$ echo learning shell program with ghostwu learning shell program with ghostwu ghostwu@dev:~/linux/shell$ name=ghostwu ghostwu@dev:~/linux/shell$ echo $name ghostwu ghostwu@dev:~/linux/shell$ echo "$name" ghostwu ghostwu@dev:~/linux/shell$ echo '$name' $name ghostwu@dev:~/linux/shell$ echo $name ghostwu
4,-n,不会转义换行符。-e,会转义字符
ghostwu@dev:~/linux/shell$ echo -n "ghostwu" ghostwughostwu@dev:~/linux/shell$ man echo ghostwu@dev:~/linux/shell$ echo "1\t2\t3" 1\t2\t3 ghostwu@dev:~/linux/shell$ echo -e "1\t2\t3" 1 2 3
5,打印彩色输出
在终端中生成彩色输出相当好玩,我们可以使用转义序列来实现。
每种颜色都有对应的颜色码。比如:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝
色=34,洋红=35,青色=36,白色=37。
要打印彩色文本,可输入如下命令:
echo -e "\e[1;31m This is red text \e[0m"
\e[1;31 将颜色设为红色, \e[0m 将颜色重新置回。只需要将 31 替换成想要的颜色码就可以了。
要设置彩色背景,经常使用的颜色码是:重置=0,黑色=40,红色=41,绿色=42,黄色=43,
蓝色=44,洋红=45,青色=46,白色=47。
要打印彩色文本,可输入如下命令:
echo -e "\e[1;42m Green Background \e[0m"
ghostwu@dev:~/linux/shell$ echo "\e[1;31m Hello Ghostwu \e[0m" \e[1;31m Hello Ghostwu \e[0m ghostwu@dev:~/linux/shell$ echo -e "\e[1;31m Hello Ghostwu \e[0m" Hello Ghostwu ghostwu@dev:~/linux/shell$ echo -e "\e[1;31mHello Ghostwu \e[0m" Hello Ghostwu ghostwu@dev:~/linux/shell$ echo -e "\e[1;31mHello Ghostwu \e[0m!" Hello Ghostwu !
这个要截图,才能看出效果
变量:
在Bash中,每一个变量的值都是字符串。
无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储
5,反引号(数字1左边的那个键),表示引用命令的执行结果
ghostwu@dev:~/linux/shell$ ls how_to_use_shell.sh ghostwu@dev:~/linux/shell$ str=`ls` ghostwu@dev:~/linux/shell$ echo $str how_to_use_shell.sh
ghostwu@dev:~/linux/shell$ echo str str
注意:echo $str 与 echo str。前面表示str变量,后面表示字符串str
反引号的另一种等价写法,用小括号括起来: $()
ghostwu@dev:~/linux/shell$ echo str2 str2 ghostwu@dev:~/linux/shell$ str2=$(ls) ghostwu@dev:~/linux/shell$ echo $str2 how_to_use_shell.sh
str2=$(ls):取得ls命令执行后的结果赋值给str2这个变量【注意:变量=值, 表示变量赋值,或者改写变量的值,要使用变量的值(访问变量的值)在变量前面用$】
ghostwu@dev:~/linux/shell$ str=`date "+%F"` ghostwu@dev:~/linux/shell$ echo $str 2018-05-28
ghostwu@dev:~/linux/shell$ str2=$(date "+%F") ghostwu@dev:~/linux/shell$ echo $str2 2018-05-28
变量引用的应用:可以把变量返回的值,拿来作为其他的应用,如时间的返回值,常用来备份文件
ghostwu@dev:~/linux/shell$ tar czvf `date "+%F"`_shell.tar.gz how_to_use_shell.sh how_to_use_shell.sh ghostwu@dev:~/linux/shell$ ls 2018-05-28_shell.tar.gz how_to_use_shell.sh
6,引用命令行的参数,用$1..$9,大于10用大括号括起来,如:${10}
ghostwu@dev:~/linux/shell/how_to_use_var$ cat var.sh #!/bin/bash echo $1 $2 $3 ${10} ghostwu@dev:~/linux/shell/how_to_use_var$ bash var.sh {a..z} a b c j
给var.sh传入26个字母作为参数, a--->$1,b--->$2, c----->$3, j---->$10
7,$0表示脚本本身
>如果用bash单纯执行脚本,$0就是脚本的名称
>如果用全路径执行脚本,那么$0就是脚本的名称+路径
ghostwu@dev:~/linux/shell/how_to_use_var$ bash var.sh var.sh ghostwu@dev:~/linux/shell/how_to_use_var$ bash ~/linux/shell/how_to_use_var/var.sh /home/ghostwu/linux/shell/how_to_use_var/var.sh
8,dirname获取脚本的路径,basename获取脚本名称
ghostwu@dev:~/linux/shell/how_to_use_var$ dirname ~/linux/shell/how_to_use_var/var.sh /home/ghostwu/linux/shell/how_to_use_var ghostwu@dev:~/linux/shell/how_to_use_var$ basename ~/linux/shell/how_to_use_var/var.sh var.sh
9,$# 获取参数的个数
ghostwu@dev:~/linux/shell/how_to_use_var$ cat var.sh #!/bin/bash echo $# ghostwu@dev:~/linux/shell/how_to_use_var$ bash var.sh {a..j} 10
10,判断参数的个数,给出一些提示信息
ghostwu@dev:~/linux/shell/how_to_use_var$ bash var2.sh a usage:/bin/bash var2.sh arg1 arg2 ghostwu@dev:~/linux/shell/how_to_use_var$ bash var2.sh a b a b ghostwu@dev:~/linux/shell/how_to_use_var$ cat var2.sh #!/bin/bash if [ $# -ne 2 ] then echo "usage:/bin/bash $0 arg1 arg2" exit 1 fi echo $1 $2
11,set -- 设置位置参数,跟命令行传参差不多
ghostwu@dev:~$ set -- hello ghost wu ghostwu@dev:~$ echo $# 3 ghostwu@dev:~$ echo $1 hello ghostwu@dev:~$ echo $2 ghost ghostwu@dev:~$ echo $3 wu
12,$@, $*,不加引号时,输出所有参数
ghostwu@dev:~$ set -- hello ghost wu ghostwu@dev:~$ echo $# 3 ghostwu@dev:~$ echo $1 hello ghostwu@dev:~$ echo $2 ghost ghostwu@dev:~$ echo $3 wu ghostwu@dev:~$ echo $* hello ghost wu ghostwu@dev:~$ echo $@ hello ghost wu ghostwu@dev:~$ for i in $*; do echo $i; done hello ghost wu ghostwu@dev:~$ for i in $@; do echo $i; done hello ghost wu
加双引号时,在循环遍历的情况下:"$*" 所有参数当做一个参数。 "$@"输出所有参数
ghostwu@dev:~$ echo "$*" hello ghost wu ghostwu@dev:~$ echo "$@" hello ghost wu ghostwu@dev:~$ for i in "$*"; do echo $i; done hello ghost wu ghostwu@dev:~$ for i in "$@"; do echo $i; done hello ghost wu
下面的例子,相当于加引号的 "$@"
ghostwu@dev:~$ for i;do echo $i; done hello ghost wu
shift:将位置参数左移
ghostwu@dev:~$ echo $# $1 $2 $3 3 hello ghost wu ghostwu@dev:~$ shift ghostwu@dev:~$ echo $# $1 $2 $3 2 ghost wu
13,$? 获取上一条命令的执行状态返回值( 0 为成功,非0为失败 )
ghostwu@dev:~$ pwd /home/ghostwu ghostwu@dev:~$ echo $? 0 ghostwu@dev:~$ cd /root bash: cd: /root: Permission denied ghostwu@dev:~$ echo $? 1