Linux Bash 笔记

来源:互联网 发布:易语言循环查询数据库 编辑:程序博客网 时间:2024/06/08 00:43

1. ()和{}

以{}括起来的全部命令视为一条命令,出现在管道的一边。例如:

{ echo "User Report for `date`."; who;} | pr

注意:{后面必须要有一个空格,}前必须要有分号,另外{}内的内容可以多行。

()可以完成与{}一样的效果,而且无需加空格和分号

注:()和{}有本质的区别是:()会生成新的子shell进程,而不会改变父shell的变量值及工作目录

(a="new value-1";echo $a)


2. 一些字符串测试

[ian@pinguino ~]$ test “abc” = “def” ;echo $?
1
[ian@pinguino ~]$ [ "abc" != "def" ];echo $?
0
[ian@pinguino ~]$ [ "abc" \< "def" ];echo $?
0
[ian@pinguino ~]$ [ "abc" \> "def" ];echo $?
1
[ian@pinguino ~]$ [ "abc" \< "abc" ];echo $?
1
[ian@pinguino ~]$ [ "abc" \> "abc" ];echo $?
1


3. 文件测试

-d目录
-e存在(也可以用 -a)
-f普通文件
-h符号连接(也可以用 -L)
-p命名管道
-r可读
-s非空
-S套接字
-w可写
-N从上次读取之后已经做过修改

-nt测试 file1 是否比 file2 更新。修改日期将用于这次和下次比较。
-ot测试 file1 是否比 file2 旧。
-ef测试 file1 是不是 file2 的硬链接。

-o 操作符允许测试利用 set -o 选项 设置的各种 shell 选项,如果设置了该选项,则返回 True (0),否则返回 False (1)

[ian@pinguino ~]$ set +o nounset
[ian@pinguino ~]$ [ -o nounset ];echo $?
1
[ian@pinguino ~]$ set -u
[ian@pinguino ~]$ test -o nounset; echo $?
0


4. 组合和分组测试

[ian@pinguino ~]$ test “a” != “$HOME” -a 3 -ge 4 ; echo $?
1
[ian@pinguino ~]$ [ ! \( "a" = "$HOME" -o 3 -lt 4 \) ]; echo $?
1
[ian@pinguino ~]$ [ ! \( "a" = "$HOME" -o '(' 3 -lt 4 ')' ")" ]; echo $?
1


5.分配和测试算术表达式

[ian@pinguino ~]$ let x=2 y=2**3 z=y*3;echo $? $x $y $z
0 2 8 24
[ian@pinguino ~]$ (( w=(y/x) + ( (~ ++x) & 0x0f ) )); echo $? $x $y $w
0 3 8 16
[ian@pinguino ~]$ (( w=(y/x) + ( (~ ++x) & 0x0f ) )); echo $? $x $y $w
0 4 8 13


6. 使用 [[ 复合命令

[ian@pinguino ~]$ [[ ( -d "$HOME" ) && ( -w "$HOME" ) ]] &&
> echo “home is a writable directory”
home is a writable directory


7.用 [[ 进行通配符测试

[ian@pinguino ~]$ [[ "abc def .d,x--" == a[abc]*\ ?d* ]]; echo $?
0
[ian@pinguino ~]$ [[ "abc def c" == a[abc]*\ ?d* ]]; echo $?
1
[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* ]]; echo $?
1

甚至还可以在 [[ 复合命令内执行算术测试,但是千万要小心。除非在 (( 复合命令内,否则 < 和 > 操作符会把操作数当成字符串比较并在当前排序序列中测试它们的顺序。清单 8 用一些示例演示了这一点。

[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || (( 3 > 2 )) ]]; echo $?
0
[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || 3 -gt 2 ]]; echo $?
0
[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || 3 > 2 ]]; echo $?
0
[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || a > 2 ]]; echo $?
0
[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || a -gt 2 ]]; echo $?
-bash: a: unbound variable


8.在 shell 中用 echo 和 $(( )) 直接进行计算

[ian@pinguino ~]$ echo $((3 + (4**3 /2)))
35


9.变量替换

${var-default} 表示如果变量 $var 还没有设置,则保持 $var 没有设置的状态,并返回后面的默认值 default。
${var=default} 表示如果变量 $var 还没有设置,则取后面的默认值 default。
${var+otherwise} 表示如果变量 $var 已经设置,则返回 otherwise 的值,否则返回空( null )。
${var?err_msg} 表示如果变量 $var 已经设置,则返回该变量的值,否则将后面的 err_msg 输出到标准错误输出上。


10. 标准变量(大部分都是环境变量)

EXINIT:保存使用vi初始化选项,如EXINIT='set nu tab=4';exprot EXINIT
IFS:域分隔符,默认是空格,可改边IFS=: 或 IFS=':'
HOME:主目录
LOGNAME:登录名
MAILCHECK:每隔多长时间检查是否有邮件
MAILPATH:用于多个邮箱时查看MAIL存储在哪几个文件中
TERM:终端类型
PATH:指定了当用户输入命令时linux搜索程序的目录由冒号:分隔,shell将按PATH中给出的顺序搜 索这些目录。找到的第一个与命令名称一致的可执行文件将被执行
TZ:时区
PS1:主提示符,其缺省值 '[\u@\h \w]\$ '
u:用户 h:主机名 w:当前的目录。最后的"$"是普通用户的提示符,特权用户是"#"
PS2:辅助提示符,一行中若需用多个命令时的提示符,缺省是">",如果用户在行末输入"\",然后 回车, 则会有改符号出现。
PWD:当前运行的进程号
$$:当前运行的进程号
$!后台运行的最后一个进程的ID
$- 显示shell使用的当前选项,与set相同
$? 显示最后命令的退出状态,0表示没有错误,其他表示错误。


11. 从文件路径字符串中提取有用信息

${var:pos} 表示去掉变量 $var 中前 pos 个字符。
${var:pos:len} 表示变量 $var 中去掉前 pos 个字符后的剩余字符串的前 len 个字符。
${var/pattern/replacement} 表示将变量 $var 中第一个出现的 pattern 模式替换为 replacement 字符串。
${var//pattern/replacement} 表示将变量 $var 中出现的所有 pattern 模式全部都替换为 replacment 字符串。


12 用 BASH 设计简单用户界面

select var in
do
statments use $var
done 

#!/bin/bash

OPTIONS="Hello Quit"
select opt in $OPTIONS; do
if [ "$opt" = "Quit" ]; then
echo done
exit
elif [ "$opt" = "Hello" ]; then
echo Hello World
else
clear
echo bad option
fi
done 



原创粉丝点击