缓解ssh服务器双重认证问题,他学到了许多有用且很酷的东西。

一、Colors your echo

大多数情况下,你希望输出echo Color,比如绿色代表成功,红色代表失败,×××代表警告。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25


​NORMAL=$(tput sgr0)​

​GREEN=$(tput setaf 2; tput bold)​

​YELLOW=$(tput setaf 3)​

​RED=$(tput setaf 1)​

​function​​​​red() {​

​echo -e ​​​​"$RED$*$NORMAL"​

​}​

​function​​​​green() {​

​echo -e ​​​​"$GREEN$*$NORMAL"​

​}​

​function​​​​yellow() {​

​echo -e ​​​​"$YELLOW$*$NORMAL"​

​}​

​# To print success​

​green ​​​​"Task has been completed"​

​# To print error​

​red ​​​​"The configuration file does not exist"​

​# To print warning​

​yellow ​​​​"You have to use higher version."​


这里使用tput来设置颜色、文本设置并重置到正常颜色。想更多了解tput,请参阅​​prompt-color-using-tput​​。

二、To print debug information (打印调试信息)

打印调试信息只需调试设置flag。

1

2

3

4

5

6

7

8

9


​function​​​​debug() {​

​if​​​​[[ $DEBUG ]]​

​then​

​echo ​​​​">>> $*"​

​fi​

​}​

​# For any debug message​

​debug ​​​​"Trying to find config file"​


某些极客还会提供在线调试功能:

1

2

3


​# From cool geeks at hacker news​

​function​​​​debug() { ((DEBUG)) && echo ​​​​">>> $*"​​​​; }​

​function​​​​debug() { [ ​​​​"$DEBUG"​​​​] && echo ​​​​">>> $*"​​​​; }​


三、To check specific executable exists or not (检查特定可执行的文件是否存在)

1

2

3

4

5

6

7

8

9

10

11

12


​OK=0​

​FAIL=1​

​function​​​​require_curl() {​

​which curl &>/dev/​​​​null​

​if​​​​[ $? -eq 0 ]​

​then​

​return​​​​$OK​

​fi​

​return​​​​$FAIL​

​}​


这里使用which来命令查找可执行的curl 路径。如果成功,那么可执行的文件存在,反之则不存在。将&>/dev/null设置在输出流中,错误流会显示to /dev/null (这就意味着在控制板上没有任何东西可打印)。

有些极客会建议直接通过返回which来返回代码。

1

2

3


​# From cool geeks at hacker news​

​function​​​​require_curl() { which ​​​​"curl"​​​​&>/dev/​​​​null​​​​; }​

​function​​​​require_curl() { which -s ​​​​"curl"​​​​; }​


四、To print usage of scripts  (打印使用的脚本)

当我开始编写shell 脚本,我会用echo来命令打印已使用的脚本。当有大量的文本在使用时, echo命令会变得凌乱,那么可以利用cat来设置命令。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17


​cat << EOF​

​Usage: myscript <command> <arguments>​

​VERSION: 1.0​

​Available Commands​

​install - Install package​

​uninstall - Uninstall package​

​update - Update package​

​list - List packages​

​EOF​


这里的<<被称为<<​​here document​​,字符串在两个EOF中。

五、User configured value vs Default value (用户配置值VS 默认值)

有时,如果用户没有设置值,那么会使用默认值。

1


​URL=${URL:-http:​​​​//localhost:8080}​


检查URL环境变量。如果不存在,可指定为localhost。

六、To check the length of the string 检查字符串长度

1

2

3

4

5


​if​​​​[ ${​​​​#authy_api_key} != 32 ]​

​then​

​red ​​​​"you have entered a wrong API key"​

​return​​​​$FAIL​

​fi​


利用 ${#VARIABLE_NAME} 定义变量值的长度。

七、To read inputs with timeout (读取输入超时)

1

2

3

4

5

6

7

8


​READ_TIMEOUT=60​

​read -t ​​​​"$READ_TIMEOUT"​​​​input​

​# if you do not want quotes, then escape it​

​input=$(sed ​​​​"s/[;\`\"\$\' ]//g"​​​​<<< $input)​

​# For reading number, then you can escape other characters​

​input=$(sed 's/[^0-9]*​​​​//g' <<< $input)​


八、To get directory name and file name  (获取目录名和文件名)

1

2

3

4

5

6

7

8


​# To find base directory​

​APP_ROOT=`dirname ​​​​"$0"​​​​`​

​# To find the file name​

​filename=`basename ​​​​"$filepath"​​​​`​

​# To find the file name without extension​

​filename=`basename ​​​​"$filepath"​​​​.html`​


英文来源:​​What-I-learned-from-other-s-shell-scripts​