Reference
运算成分
1.逻辑运算
[]
[[ ]] :No filename expansion,no wordspliting, test string and digits
&& :if left $? ==0 then execute right, that is the left must be a command not a number, Got it?
II
2. Expansion
2.1 Brace expansion
我觉得brace expansion 要远比wildcard[]要有意思,纯粹主观。
{xxx,yyy,zzz,...} deatails in abs
{a..z} or {1..10} or {....}:Extended Brace expansion.
不支持变量定界因为变量扩展执行顺序晚于Brace expansion。
2.2 Tidle expansion
2.3 Parameter expansion
这是shell中见到的最多的Expansion
Parameter之前有声明过 expansion要使用带冒号:版的参数扩展,我不理解为什么做这样的区分?
理解背后的因由对于熟练使用Parameter expansion意义非凡。通过观察我们可知不管是否之前parameter是否定义(或声明,不区分),只要parameter没有被赋值。name带冒号:这版本的参数扩展总生效。所以这背后的玄机就隐藏在不带冒号的 参数扩展中。如果之前没有被声明过,则无冒号的参数扩展也生效,所以只剩下一种无效的情况就是声明过了,使用无冒号进行参数替换。我们忽略掉有冒号的参数替换。一个新的变量(之前没有声明过),我们可以安心地为他准备一个默认的直。但是之前声明过的变量,我们要格外看待。也许有其他的用途,不容我们干扰。建议使用有冒号版的大锅炖,一锅端不用那么操心。
${parameter=default}, ${parameter:=default}:If parameter not set, set it to default.
${parameter-default}, ${parameter:-default} :If parameter not set, use default.
${parameter+alt_value}, ${parameter:+alt_value}
If parameter set, use alt_value, else use null string.这是上面减号相反版本。
${parameter?err_msg}, ${parameter:?err_msg}
If parameter set, use it, else print err_msg and abort the script with an exit status of 1.类似加号版本
2.4Command Expansion
2.5 Arithmetic Expansion
(()):avoid $ prefix before variable, same as let
$(()):simlar to (()), but return final value
2.6 Path Expansion。
3 Manuplating string 位置从0开始,可是awk是从1开始。
3.1 String Length
${#string}
expr length $string
expr "$string" : '.*'
3.2 Index , the first position of mating substring of String
expr index "$sting" '$subsring'
$substring 不是正则,且只对单子符有效。
逆向字符串查找
方法 一
var="A12345A67890123A45"
tmp=$(echo $var | sed 's/\(.*A\)\(.*\)/\1/')
echo ${#tmp}
方法二
awk 'BEGIN{match("x00x11xxa",/.*x/);print RLENGTH;}'
BTW:还有RSTART 这个变量
方法三 这个我也想到了,其实这个最用可以找到倒数的任何一个。要得到倒数第二个要另外减掉分隔符A的1.
pos=`echo "$strToCheck" | awk -F ''$charToSearch'' '{printf "%d", length($0)-length($NF)}'`
BTW:awk 测试语句,awk 真的很牛。
ls -l $(find -typ f .)| awk '$5 > 10240 {print $9}'
3.3 Length of Matching Substring at Beginning of String
expr match "$string" '$substring'
$substring is a regular expression.
expr "$string" : '$substring'
$substring is a regular expression.
3.4 Substring Extraction
可以结合上面的expr index 和expr match 使用。
${string:position} //这里若position 是负值,反向数。要用括号防止和 参数扩展混了!
${string:position:length}
expr substr $string $position $length
expr match "$string" '\($substring\)' //匹配从头开始的子串
expr "$string" : '\($substring\)' //match的等价版
expr match "$string" '.*\($substring\)' //匹配从结尾开始的子串
expr match "$string" '.*\($substring\).*' //匹配中间的子串
3.5 Substring Removal
${string#substring} //delete shortest match
${string##substring} //delete longest match
${string%substring} //从后面匹配,删除。
${string%%substring}
3.6 Substring Replacement
${string/substring/replacement}
Replace first match of $substring with $replacement.
${string//substring/replacement}
Replace all matches of $substring with $replacement.
${string/#substring/replacement}
If $substring matches front end of $string, substitute $replacement for $substring.
${string/%substring/replacement} //这个先用awk 得到后缀 ,就能完成我的文件名了哈哈。
If $substring matches back end of $string, substitute $replacement for $substring.
传输成分
1.I/O
echo:
read:
2. Function
2.1 parameters: calling funtion, floowing the funtion name
2.2 return value: return syntax, global value for large value.
数据成分
1.Special variables
"$*" : "para1 para2 para3..."
"$@": ""para1" "para2" "para3" "...""
2. Wildcard, effects without quoting
*:ls: 无法访问 d*.txt: 没有那个文件或目录, 匹配未成功,通配符就变成普通字符传递给ls了。其他命令类似
?:represent only one character
[]: represent only one character of charset appeared in bracket
[!]: inver the sense of matching ablove.
{ , , ...}:at least tow charsets,for example ls *{[0-9][0-9],sh}
3.Metacharacter
A character that, when unquoted, separates words. One of the following:
| & ; ( ) < > space tab
4.Escape character
"" '' \
控制成分
FAQ
while read中的awk 从哪里读? read的用途。