当启动shell时,它一开始会执行一组命令来定义诸如提示文本、颜色,环境变量等各类设置。这组命令来自位于用户主目录中的脚本文件~/.bashrc(对于登录shell则是~/.bash_profile)。Bash还维护了一个历史记录文件~/.bash_history,用于保存用户运行过的命令。
在Bash中,每个命令或是命令序列是通过使用分号或换行符来分隔的。比如:
$ cmd1 ; cmd2
它等同于:
$ cmd1
$ cmd2
1.shell的提示模式:
用户名@主机名
username@hostname$: 或者 root@hostname #,其中的$表示普通用户,#表示管理员用户root
2. shell脚本
第一行:#!/bin/bash,/bin/bash是Bash的解释器命令路径
3. 执行shell脚本
有两种运行脚本的方式。一种是将脚本作为bash的命令行参数,另一种是授予脚本执行权限,将其变为可执行文件。
3.1 bash /xx/xx.sh
3.2 chmod a+x script.sh ./script.sh #./表示当前目录
内核会读取脚本的首行并注意到shebang为#!/bin/bash。它识别出/bin/bash并在内部像这样执行该脚本:
$ /bin/bash script.sh
4. echo命令
echo "hello world"
echo 'hello world' //变量替换在单引号中无效
使用单引号时,变量不会被扩展(expand),将依照原样显示。这意味着:
$ echo '$var' will print $var在默认情况下,echo会将一个换行符追加到输出文本的尾部。可以使用选项-n来忽略结尾的换行符。echo同样接受双引号字符串内的转义序列作为参数。如果需要使用转义序列,则采用echo –e "包含转义序列的字符串"这种形式。例如:
echo -e "1\t2\t3"
1 2 3
5. printf.sh脚本
#!/bin/bash
#文件名: printf.sh
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
我们会得到如下格式化的输出:
No Name Mark
1 Sarath 80.35
2 James 91.00
3 Jeff 77.56
%s、%c、%d和%f都是格式替换符(format substitution character),其所对应的参数可以置于带引号的格式字符串之后。
%-5s指明了一个格式为左对齐且宽度为5的字符串替换(-表示左对齐)。如果不用-指定对齐方式,字符串就采用右对齐形式。宽度指定了保留给某个变量的字符数。对Name而言,保留宽度是10。因此,任何Name字段的内容都会被显示在10字符宽的保留区域内,如果内容不足10个字符,余下的则以空格符填充。对于浮点数,可以使用其他参数对小数部分进行舍入。对于Mark字段,将其格式化为%-4.2f,其中.2指定保留2个小数位。注意,在每行格式字符串后都有一个换行符(\n)。
5.变量和环境变量
可以使用env命令查看所有与终端相关的环境变量。对于进程来说,其运行时的环境变量可以使用下面的命令来查看:
cat /proc/$PID/environ
获得某个程序的pid:pidof sshd 或者pgrep sshd
$ cat /proc/12501/environ
GDM_KEYBOARD_LAYOUT=usGNOME_KEYRING_PID=1560USER=slynuxHOME=/home/slynux
为了好看,可以:cat /proc/12501/environ | tr '\0' '\n' //彼此之间由null字符(\0)分隔
环境变量是未在当前进程中定义,而从父进程中继承而来的变量。例如环境变量HTTP_PROXY,它定义了互联网连接应该使用哪个代理服务器。该环境变量通常被设置成:
HTTP_PROXY=192.168.1.23:3128export HTTP_PROXY //export命令用来设置环境变量
修改环境变量:
export PATH=/opt/myapp/bin:$PATH
export LD_LIBRARY_PATH=/opt/myapp/lib;$LD_LIBRARY_PATH
6. 修改Bash提示字符串(username@hostname:~$)
当我们打开终端或是运行shell时,会看到类似于user@hostname:/home/$的提示字符串。
不同GNU/Linux发布版中的提示及颜色略有不同。我们可以利用PS1环境变量来定制提示文本。
默认的shell提示文本是在文件~/.bashrc中的某一行设置的。
可以使用如下命令列出设置变量PS1的那一行:
$ cat ~/.bashrc | grep PS1
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
如果要设置一个定制的提示字符串,可以输入:
slynux@localhost: ~$ PS1="PROMPT>"
PROMPT> Type commands here #提示字符串已经改变
我们可以利用类似\e[1;31的特定转义序列来设置彩色的提示字符串(参考1.2节的内
容)。
还有一些特殊的字符可以扩展成系统参数。例如:\u可以扩展为用户名,\h可以扩展为主
机名,而\w可以扩展为当前工作目录。