经典的 Shell 十三问( 二 )


${file%%.*} # 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是去掉左边(在键盘上 # 在 $ 之左边)
% 是去掉右边(在键盘上 % 在 $ 之右边)
单一符号是最小匹配﹔两个符号是最大匹配 。# 5. shell字符串取子串:
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续 5 个字节:/dir2
# 6. shell字符串变量值的替换:
${file/dir/path}:将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部 dir 提换为 path:/path1/path2/path3/my.file.txt
# 7. ${}还可针对变量的不同状态(没设定、空值、非空值)进行赋值:
${file-my.file.txt}:假如 $file没有设定,则使用 my.file.txt 作传回值 。(空值及非空值时不作处理)
${file:-my.file.txt}:假如 $file没有设定或为空值,则使用 my.file.txt 作传回值 。(非空值时不作处理)
${file+my.file.txt}:假如 $file设为空值或非空值,均使用 my.file.txt 作传回值 。(没设定时不作处理)
${file:+my.file.txt}:若 $file为非空值,则使用 my.file.txt 作传回值 。(没设定及空值时不作处理)
${file=my.file.txt}:若 $file没设定,则使用 my.file.txt 作传回值,同时将 $file赋值为 my.file.txt。(空值及非空值时不作处理)
${file:=my.file.txt}:若 $file没设定或为空值,则使用 my.file.txt 作传回值,同时将 $file赋值为 my.file.txt。(非空值时不作处理)
${file?my.file.txt}:若 $file没设定,则将 my.file.txt 输出至 STDERR 。(空值及非空值时不作处理)
${file:?my.file.txt}:若 $file没设定或为空值,则将 my.file.txt 输出至 STDERR 。(非空值时不作处理)
tips:
以上的理解在于, 你一定要分清楚 unset与 null 及 non-null 这三种赋值状态.
一般而言, : 与 null 有关, 若不带 : 的话, null 不受影响, 若带 : 则连 null 也受影响.
# 8. 计算shell字符串变量的长度:${#var}
${#var}可计算出变量值的长度:
${#file}可得到 27 ,因为 /dir1/dir2/dir3/my.file.txt 刚好是 27 个字节...
# 9. bash数组(array)的处理方法
数组:
A=(a b c d)
引用数组:
${A[@]}
${A[*]}
访问数组成员
${A[0]}
计算数组长度
${#A[@]}
${#A[*]}
数组重新赋值
A[2]=xyz
# 10.$(( ))是用来做整数运算的
a=5;b=7;c=2;
echo$(( a + b * c))
9. 与 * 区别在哪?
"$@" 则可得到 "p1" "p2 p3" "p4" 这三个不同的词段
"$*" 则可得到 "p1 p2 p3 p4" 这一整串单一的词段
10.与 || 差在哪?
test命令有两种形式
test expression
[ expression ]
bash的test目前支持三种测试对象
string:字符串
integer:整数
file:文件
当expression为真是返回 0(true) ,否则返回 非0(false)
command1command2 # command2只有在command1的RV为0(true)的条件下执行 。
command1 || command2 # command2只有在command1的RV为非0(false)的条件下执行 。
先替换变量再比较
A=123
[ -n "$A" ]([ "$A" -lt 100 ] || echo "too big")
unset A 11.与差在哪?
0: Standard Input (STDIN)
1: Standard Output (STDOUT)
2: Standard Error Output (STDERR)
我们可用来改变读进的数据信道(stdin),使之从指定的档案读进 。
我们可用来改变送出的数据信道(stdout, stderr),使之输出到指定的档案 。
ls my.file no.such.file 1 file.out 2file.err
# 21 就是将stderr并进stdout做输出
ls my.file no.such.file 1 file.out 21
# /dev/null 空
ls my.file no.such.file /dev/null 21
catfilefile
# 在 IO Redirection 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料 。


以上关于本文的内容,仅作参考!温馨提示:如遇专业性较强的问题(如:疾病、健康、理财等),还请咨询专业人士给予相关指导!

「辽宁龙网」www.liaoninglong.com小编还为您精选了以下内容,希望对您有所帮助: