#《快乐的 Linux 命令行》

#for

1
2
3
for variable [in words]; do
commands
done

最新版本的bash已经添加了第二种格式的for命令语法:

1
2
3
for (( expression1; expression2; expression3 )); do
commands
done

下述命令用来设置默认值:

1
${parameter:-word}

下述命令用来设置默认值,并且将word的值赋值给parameter(位置参数或其它的特殊参数不能以这种方式赋值):

1
${parameter:=word}

parameter没有设置或为空,这种展开导致脚本带有错误退出,并且word的内容会发送到标准错误:

1
${parameter:?word}

parameter没有设置或为空,展开结果为空。若parameter不为空,展开结果是word的值,parameter的值不会改变:

1
${parameter:+word}

返回以prefix开头的已有变量名的展开:

1
2
3
# 两者等效
${!prefix*}
${!prefix@}

${#parameter}展开成parameter所包含的字符串的长度。
如果parameter@或者是*,展开结果是位置参数的个数。

${parameter:offset} ${parameter:offset:length}展开parameteroffset个字符(从字符串开头算起)直到字符串的末尾,除非指定提取的长度。
offset的值为负数,则认为offset值是从字符串的末尾开始算起。负数前面必须有一个空格,为防止与${parameter:-word}展开形式混淆。length若出现,则必须不能小于零。
如果parameter@,展开结果是length个位置参数,从第offset个位置参数开始。

${parameter#pattern} ${parameter##pattern}paramter所包含的字符串开头中清除pattern匹配的字符串。#形式清除最短的匹配结果,##模式清除最长的匹配结果。

${parameter%pattern} ${parameter%%pattern}paramter所包含的字符串结尾中清除pattern匹配的字符串。

${parameter/pattern/string} ${parameter//pattern/string} ${parameter/#pattern/string} ${parameter/%pattern/string}parameter的内容执行查找和替换操作。
在正常形式下,只有第一个匹配项会被替换掉。
//形式下,所有的匹配项都会被替换掉。
/#要求匹配项出现在字符串的开头
/#要求匹配项出现在字符串的结尾
/string可能会省略掉,这样会导致删除匹配的文本。

1
2
3
4
5
6
7
8
9
$ foo=JPG.JPG
$ echo ${foo/JPG/jpg}
jpg.JPG
$ echo ${foo//JPG/jpg}
jpg.jpg
$ echo ${foo/#JPG/jpg}
jpg.JPG
$ echo ${foo/%JPG/jpg}
JPG.jpg

${parameter,,}parameter的值全部展开成小写字母。
${parameter,}parameter的第一个字符展开成小写字母。
${parameter^^}parameter的值全部转换成大写字母。
${parameter^}parameter的第一个字符转换成大写字母(首字母大写)。

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

# ul-param - demonstrate case conversion via parameter expansion

if [[ $1 ]]; then
echo ${1,,}
echo ${1,}
echo ${1^^}
echo ${1^}
fi
1
2
3
4
5
6
7
$ vi ul-param
$ chmod +x ul-param
$ ./ul-param aBc
abc
aBc
ABC
ABc

在算术表达式中,以0开头的数字被认为是八进制数,0x代表十六进制,base#number指定任意进制。

1
2
3
4
(base) hs@hs-Z390-AORUS-PRO:/mnt/data/onns/Desktop$ echo $((0xff))
255
(base) hs@hs-Z390-AORUS-PRO:/mnt/data/onns/Desktop$ echo $((2#11111111))
255

#数组

1
2
3
4
5
# 单个赋值
name[subscript]=value

# 多个赋值
name=(value1 value2 ...)

下标*@可以被用来访问数组中的每一个元素。