shell脚本通常以shebang起始:#!/bin/bash/
脚本的执行方式有两种:
bash myScript.sh
如果将脚本作为bash的命令行参数来运行,那么就用不着使用shebang了。- # 赋予脚本可执行权限
- chmod 755 myScript.sh
- chmod a+x myScript.sh
-
- # 执行脚本
- ./myScript.sh # ./表示当前目录
- /home/path/myScript.sh # 使用脚本的完整路径
-
- # 内核会读取脚本的首行并注意到shebang为#!/bin/bash。它会识别出/bin/bash并执行该脚本:
- /bin/bash myScript.sh
当启动一个交互式shell时,它会执行一组命令来初始化提示文本、颜色等设置。这组命令来自用户主目录中的脚本文件~/.bashrc
(对于登录shell则是~/.bash_profile
)。Bash shell还维护了一个历史记录文件~/.bash_history
,用于保存用户运行过的命令。
注意:登录shell是登录主机后创建的那个shell。但登录图形化环境(比如GNOME、KDE等)后所创建的终端会话并不是登录shell。使用GNOME或KDE这类显示管理器登录后并不会读取.profile或.bash_profile(绝大部分情况下不会),而使用ssh登录远程系统时则会读取.profile。shell使用分号或换行符来分隔单个命令或命令序列。
- echo Welcome to bash
- echo 'Welcome to bash'
- echo "Weclome to bash"
-
- # 如果不使用引号,我们无法在echo中使用分号,因为分号在Bash shell中用作命令间的分隔符:
- echo hello;echo xixi
- hello
- xixi
转义字符:
默认情况下,echo会在输出文本的尾部追加一个换行符。可以使用选项-n来禁止这种行为。echo同样接受双包含转义序列的双引号字符串作为参数。在使用转义序列时,需要使用echo -e "包含转义序列的字符串"这种形式。
- echo -e "1\t2\t3" # 输出:1 2 3 而不是 1\t2\t3
- echo -n haha # 输出时文本尾部没有换行
打印彩色输出:
脚本可以使用转义序列在终端中生成彩色文本:
- # 打印彩色文本
- echo -e "\e[1;31m This is red text \e[0m" # 以红色字体打印 This is red text
-
- # 设置彩色背景
- echo -e "\e[1;42m Green Background \e[0m" # 将 Green Bachground 的文本背景设置为绿色
printf命令接受引用文本或由空格分隔的参数。默认情况下,printf并不会自动添加换行符,需手动指定。
可以在printf中使用格式化字符串来指定字符串的宽度、左右对齐方式等。
- #!/bin/bash
-
- printf "%-5s %-10s %-4s\n" No Name Mark
- printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
- printf "%-5s %-10s %-4.2f\n" 2 James 90.9989
- printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564
所有的编程语言都利用变量来存放数据,以备随后使用或修改。和编译型语言不同,大多数脚本语言不要求在创建变量之前声明其类型。用到什么类型就是什么类型。在变量名前面加上一个美元符号就可以访问到变量的值。shell定义了一些变量,用于保存用到的配置信息,比如可用的打印机、搜索路径等。这些变量叫作环境变量。
变量名由一系列字母、数字和下划线组成,其中不包含空白字符。常用的惯例是在脚本中使用大写字母命名环境变量,使用驼峰命名法或小写字母命名其他变量。
- # 假设有一个叫作gedit的应用程序正在运行。我们可以使用pgrep命令获得gedit的进程ID:
- pgrep gedit
-
- # 假设查到的 gedit 的进程ID为 12501,那么可以通过如下命令查看与该进程相关的环境变量:
- cat /proc/12501/environ
-
- # 要想生成一份易读的报表,可以将cat命令的输出通过管道传给tr,将其中的\0替换成\n:
- cat /proc/12501/environ | tr '\0' '\n'
使用等号操作符为变量赋值:varName=value
var = value
不同于 var=value
。把var=value写成var = value是一个常见的错误。两边没有空格的等号是赋值操作符,加上空格的等号表示的是等量关系测试。在变量名之前加上美元符号($)就可以访问变量的内容。可以在printf、echo或其他命令的双引号中引用变量值:
- #!/bin/bash
-
- fruit=apple
- count=5
- echo "We have $count ${fruit}(s)"
---------------------------------------------------
环境变量是从父进程中继承而来的变量。例如环境变量HTTP_PROXY,它定义了Internet连接应该使用哪个代理服务器。该环境变量通常被设置成:
- HTTP_PROXY=192.168.1.23:3128
- export HTTP_PROX
PATH变量列出了一系列可供shell搜索特定应用程序的目录:
- echo $PATH
- -> /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
cat /etc/profile
如果需要在PATH中添加一条新路径,可以使用如下命令:
- export PATH="$PATH:/home/user/bin" # 在环境变量中添加新的路径
- echo $PATH
- -> /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/home/usr/bin
另外还有一些众所周知的环境变量:HOME、PWD、USER、UID、SHELL等。
注意:使用单引号时,变量不会被扩展,仍依照原样显示。使用双引号会显示出该变量的值
- echo '$PATH'
- -> $PATH
-
- echo "$PATH"
- -> /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/home/usr/bin: No such file or directory
------------------------------
- $ var=12345678901234567890
- $ echo ${#var}
- 20
- echo $SHELL
- echo $0
环境变量通常保存了可用于搜索可执行文件、库文件等的路径列表,如$PATH。
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
这意味着只要shell执行应用程序(二进制文件或脚本)时,它就会首先查找/usr/local/sbin,然后查找usr/local/bin 依次查找。
使用源代码构建并安装程序时,通常需要为新的可执行文件和库文件添加特定的路径。假设我们要将myapp安装到/opt/myapp,它的二进制文件在/opt/myapp/bin目录中,库文件在/opt/myapp /lib目录中。
将新路径添加到环境变量起始部分:
export PATH=/opt/myapp/bin:$PATH
使用函数添加环境变量:(案例没做出来)
我们可以在.bashrc文件中定义如下函数,简化路径添加操作:
prepend() { [ -d "$2" ] && eval $1=\"$2':'\$$1\" && export $1; }
该函数用法如下:
prepend PATH /opt/myapp/bin
在进行添加时,如果变量为空,则会在末尾留下一个:。要解决这个问题,可以对该函数再做一些修改:
prepend() { [ -d "$2" ] && eval $1=\"$2\$\{$1:+':'\$$1\}\" && export $1 ; }
${parameter:+expression}
-----------------------------------