Linux Shell 脚本攻略(一)

终端中显示输出

命令都是在终端会话中输入并执行的。打开终端时会出现一个提示符。有很多方法可以配置提示符,不过其形式通常如下:
username@hostname$
或者也可以配置成root@hostname #,或者简单地显示为$或#。
$表示普通用户,#表示管理员用户root。root是Linux系统中权限最高的用户

借助sudo这类工具来运行特权命令。使用sudo <command> <arguments> 执行命令的效果和root一样。

 

shell脚本通常以 #!/bin/bash 起始,其中#!位于解释器路径之前。/bin/bash是Bash的解释器命令路径。bash将以#符号开头的行视为注释。

脚本的执行方式有两种。
(1) 将脚本名作为命令行参数:(不需要使用  #!/bin/bash)
bash myScript.sh
(2) 授予脚本执行权限,将其变为可执行文件:
chmod 755 myScript.sh
./myScript.sh.

如果将脚本作为bash的命令行参数来运行,那么就用不着使用shebang了。可以利用shebang
来实现脚本的独立运行。可执行脚本使用shebang之后的解释器路径来解释脚本。
使用chmod命令赋予脚本可执行权限:
$ chmod a+x sample.sh
该命令使得所有用户可以按照下列方式执行该脚本:
$ ./sample.sh #./表示当前目录
或者
$ /home/path/sample.sh #使用脚本的完整路径
内核会读取脚本的首行并注意到shebang为#!/bin/bash。它会识别出/bin/bash并执行该
脚本:
$ /bin/bash sample.sh
当启动一个交互式shell时,它会执行一组命令来初始化提示文本、颜色等设置。这组命令来
自用户主目录中的脚本文件~/.bashrc(对于登录shell则是~/.bash_profile)。Bash shell还维护了一
个历史记录文件~/.bash_history,用于保存用户运行过的命令。

 

单引号 双引号

双引号允许shell解释字符串中出现的特殊字符。单引号不会对其做任何解释。

echo

打印像!这样的特殊字符,那就不要将其放入双引号中,而是使用单引号,或是在特殊字符之前加上一个反斜线(\)
$ echo Hello world !
或者
$ echo 'Hello world !'
或者
$ echo "Hello world \!" #将转义字符放在前面

不使用引号,我们无法在echo中使用分号,因为分号在Bash shell中用作命令间的分隔符:
echo hello; hello

对于上面的命令,Bash将echo hello作为一个命令,将hello作为另外一个命令。

以上 在 SSH 链接Linux时 会出现不同的结果。

printf

$ printf "Hello world"

printf命令接受引用文本或由空格分隔的参数。我们可以在printf中使用格式化字符串来
指定字符串的宽度、左右对齐方式等。默认情况下,printf并不会自动添加换行符,我们必须
在需要的时候手动指定,比如在下面的脚本中:
#!/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个字符,余下的则以空格填充。对于浮点数,可以使用其他参数对小数部分进行舍入(round off)。对于Mark字段,我们将其格式化为%-4.2f,其中.2指定保留两位小数。注意,在每行的格式字符串后都有一个换行符(\n)。

 

*****************************************************************

打印彩色输出

echo会在输出文本的尾部追加一个换行符。可以使用选项-n来禁止这种行为。echo同样接受双包含转义序列的双引号字符串作为参数。在使用转义序列时,需要使用echo -e "包含转义序列的字符串"这种形式。例如:
echo -e "1\t2\t3"
1 2 3

打印彩色输出

文本颜色是由对应的色彩码来描述的。其中包括:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37。
要打印彩色文本,可输入如下命令:
echo -e "\e[1;31m This is red text \e[0m"
其中\e[1;31m是一个转义字符串,可以将颜色设为红色,\e[0m将颜色重新置回。只需要将31替换成想要的色彩码就可以了。
对于彩色背景,经常使用的颜色码是:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47。

要设置彩色背景的话,可输入如下命令:
echo -e "\e[1;42m Green Background \e[0m"
这些例子中包含了一些转义序列。可以使用man console_codes来查看相关文档。

*********************************************************************************

 

使用变量与环境变量

 

varName=value varName是变量名,value是赋给变量的值。如果value不包含任何空白字符(例如空格),那么就不需要将其放入引号中,否则必须使用单引号或双引号。

var = value不同于var=value。把var=value写成var = value是一个常见的错误。两边没有空格的等号是赋值操作符,加上空格的等号表示的是等量关系测试。

可以在printf、echo或其他命令的双引号中引用变量值: echo "We have $count ${fruit}(s)"

 

环境变量是从父进程中继承而来的变量。例如环境变量HTTP_PROXY,它定义了Internet连接应该使用哪个代理服务器。该环境变量通常被设置成:
HTTP_PROXY=192.168.1.23:3128
export HTTP_PROXY
export命令声明了将由子进程所继承的一个或多个变量。这些变量被导出后,当前shell脚本所执行的任何应用程序都会获得这个变量。

添加环境变量:

$PATH通常定义在/etc/environment、/etc/profile或~/.bashrc中。
如果需要在PATH中添加一条新路径,可以使用如下命令:
export PATH="$PATH:/home/user/bin"
也可以使用
$ PATH="$PATH:/home/user/bin"
$ export PATH

*****************************************************************

获得字符串的长度:

length=${#var}  var=12346677  echo ${#var}

识别当前所使用的shell


可以通过环境变量SHELL获知当前使用的是哪种shell:
echo $SHELL

echo $0

检查是否为超级用户: root用户的UID是0

If [ $UID -ne 0 ]; then
echo Non root user. Please run as root.
else
echo Root user
fi

 

使用函数添加环境变量

将myapp安装到/opt/myapp,它的二进制文件在/opt/myapp/bin目录中,库文件在/opt/myapp /lib目录中

export PATH=/opt/myapp/bin:$PATH
export LD_LIBRARY_PATH=/opt/myapp/lib; $LD_LIBRARY_PATH
PATH和LD_LIBRARY_PATH现在看起来应该像这样:
PATH=/opt/myapp/bin:/usr/bin:/bin
LD_LIBRARY_PATH=/opt/myapp/lib:/usr/lib; /lib
我们可以在.bashrc文件中定义如下函数,简化路径添加操作:
prepend() { [ -d "$2" ] && eval $1=\"$2':'\$$1\" && export $1; }
该函数用法如下:
prepend PATH /opt/myapp/bin
prepend LD_LIBRARY_PATH /opt/myapp/lib

函数prepend()首先确认该函数第二个参数所指定的目录是否存在。如果存在,eval表达式将第一个参数所指定的变量值设置成第二个参数的值加上:(路径分隔符),随后再跟上第一个参数的原始值..

 

使用shell 进行数学运算

Bash shell使用let、(( ))和[]执行基本的算术操作。工具expr和bc可以用来执行高级操作。

no1=4;
no2=5;

let命令可以直接执行基本的算术操作。当使用let时,变量名之前不需要再添加$,例如:
let result=no1+no2
echo $result

自加自减: let no1++   let  no1--

let no+=6   let no-=6 等效 let no=no+6和let no=no-6。

result=$[ no1 + no2 ]

result=$[ $no1 + 5 ]

result=$(( no1 + 50 ))

result=`expr 3 + 4`

result=$(expr $no1 + 5)

bc是一个用于数学运算的高级实用工具,这个精密的计算器包含了大量的选项。我们可以借助它执行浮点数运算并使用一些高级函数:
echo "4 * 0.56" | bc
2.24
no=54;
result=`echo "$no * 1.5" | bc`
echo $result
81.0

设定小数精度。在下面的例子中,参数scale=2将小数位个数设置为2。因此,bc将
会输出包含两个小数位的数值:
echo "scale=2;22/7" | bc
3.14
 进制转换。用bc可以将一种进制系统转换为另一种。来看看下面的代码是如何在十进
制与二进制之间相互转换的:
#!/bin/bash
用途:数字转换
no=100
echo "obase=2;$no" | bc
1100100
no=1100100
echo "obase=10;ibase=2;$no" | bc
100
 计算平方以及平方根。
echo "sqrt(100)" | bc #Square root
echo "10^10" | bc #Square

 

玩转文件描述符与重定向

文件描述符是与输入和输出流相关联的整数。最广为人知的文件描述符是stdin、stdout和stderr。我们可以将某个文件描述符的内容重定向到另一个文件描述符中。

使用大于号将文本保存到文件中:
$ echo "This is a sample text 1" > temp.txt
该命令会将输出的文本保存在temp.txt中。如果temp.txt已经存在,大于号会清空该文件中先前的内容。

使用双大于号将文本追加到文件中:
$ echo "This is sample text 2" >> temp.txt

使用cat查看文件内容:
$ cat temp.txt
This is sample text 1
This is sample text 2

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值