2、字符串替换
b=${a/23/BB} #a=234523 b=BB4523
3、位置参数
basename $0 去掉脚本名称的路径名
[ -n "$1" ] true:参数存在
$#: 参数个数
$*: 单个单元,必须加引号
$@:每个参数作为一个单元
set -- "First one" "second" "third:one" :设置位置参数
args=$# # 传给脚本的参数个数.
lastarg=${!args}
4、环境变量分隔符
5、双引号 单引号
使用双引号除了变量名前缀($)、后引符(`)和转义符(\)外,其余均只解释为字面
在单引号内,除了字符',每个特殊字符都只是字面的意思。单引号(全局引用)比双引号(部分引用)更严格的处理引用部分。
若想打印 ‘号: echo \'
echo 'can' \' 't' #can ' t
echo 'can'\''t' #can't
6、感叹号表历史命令
在命令行上,把感叹号"!"放在双引号里执行命令会出错(译者注:比如说:echo "hello!"). 因为感叹号被解释成了一个历史命令. 然而在一个脚本文件里,这么写则是正确的,因为在脚本文件里Bash的历史机制被禁用了。
7、转义
\v : 垂直制表符
\a : 蜂鸣声(禁止操作声音)
echo -e “\n” == echo $'\n'
$'\xxx' : 转义字符取值 e.g. ABC=$'\101\102\103\010\t'
出乎意料:
echo \z # z
echo "\z" # \z
echo `echo \\z` # z
echo `echo \\\z` # \z 未转义过的还可加\转义,已转义过的之前\只能输出字面啦
echo `echo "\z"` # \z 双引号一加,就绝对化啦
转义\的赋值
variable=\
23skidoo
echo "$variable" # 23skidoo 这样就能工作,因为\将其后的换行符转义了哦
8、EOF
可随意换行,便于写SQL
cat <<EOF
\\z
EOF
8、内部变量
$IFS:分隔符,决定Bash在解释字符串时如何识别域, 或者单词边界. 默认为空白(空格, 制表符,和换行符)
e.g. output_args(){
for arg
do echo "$arg _"
done
}
IFS=":,"
var="a:b::c"
output_args $var #a _b _ _c _
output_args a:b::c #不行,把此当作一个参数 a:b::c _
e.g. IFS='\'
var=="'(]\\{}\$\""
echo $var # '(] {}$" \字符被空白符替换了,为什么?
echo "$var" # '(]\{}$"
$PWD:
工作目录(你当前所在的目录)
$SECONDS :
这个脚本已经运行的时间(以秒为单位)