shell 杂记(不断更新...)

终端输出奇技淫巧

1. \u{1B}[1A\u{1B}[K

这是一种 ANSI 转义序列,通常用于控制终端的光标位置和清除屏幕上的文本。”\u{1B}[1A” 表示将光标向上移动一行,”\u{1B}[K” 表示清除当前光标位置后面的文本。组合在一起,这个序列的意思是将光标移动到当前行的开头并清除该行的文本。

Pod cache

http://blog.fpliu.com/it/os/macOS/software/CocoaPods/pod-cache

shell 杂记

1. shell 语句中的while 循环语句

while test 条件
do 
# 循环体代码
done

while test $count -gt 0; do
echo ""
done

while [ $count -gt 0 ]; do
echo ""
done

2. shell 语法中的shift语句

​ 用于移动参数的位置,它将命令行参数往左移动一个位置,即第二个参数移动到第一个位置,以此类推

​ 语法为 shift [n], 可选的参数n指定移动参数的数量。如果未指定n,则默认为1,即只移动一个参数。

3. shell 中方法的定义与调用

# 定义
function_name() {
    # method body
}

# 调用
function_name parameter1 parameter2

4. shell 特殊变量

在shell编程中,$0$1是特殊变量,用于引用脚本名称和脚本的第一个参数。它们是内置的变量,可以在shell脚本中直接使用。

  • $0:代表当前脚本的名称,即执行脚本时输入的文件名或路径。例如,如果脚本名为myscript.sh,则$0将为myscript.sh
  • $1:代表脚本的第一个参数,即在执行脚本时传递给它的第一个参数。例如,如果执行myscript.sh时传递了一个参数hello,则$1将为hello

5. dirname shell命令

dirname 是一个常用的 Unix/Linux shell 命令,用于获取文件或目录路径的父目录。dirname 命令接受一个文件或目录路径作为参数,并返回该路径的父目录

6. 获取符号链接的真实地址

在 shell 脚本中,您可以使用以下方法获取当前执行符号链接(link)脚本的真实路径

bashCopy code
#!/bin/bash

# 获取当前执行符号链接脚本的真实路径
real_script_path="$( cd "$( dirname "$(readlink -f "${BASH_SOURCE[0]}")" )" &> /dev/null && pwd )"

echo "当前执行符号链接脚本的真实路径: $real_script_path"

这段代码首先使用 ${BASH_SOURCE[0]} 获取脚本的相对路径,然后使用 readlink -f 获取符号链接脚本的真实路径。接下来,使用 dirname 获取脚本所在的目录。最后,使用 cd 命令进入该目录,并使用 pwd 命令获取脚本所在目录的绝对路径。将结果赋值给 real_script_path 变量。

7. 判断数组是否为空

在 shell 脚本中,可以使用 -z 测试运算符来检查数组是否为空。以下是一个示例,演示如何检查数组是否为空:

#!/bin/bash

# 创建一个空数组
empty_array=()

# 创建一个非空数组
non_empty_array=("元素1" "元素2" "元素3")

# 数组增加新元素

non_empty_array=("${non_empty_array[*]}" "元素4" "元素5")

# 检查 empty_array 是否为空
if [ -z "${empty_array[*]}" ]; then
    echo "empty_array 是空的"
else
    echo "empty_array 不是空的"
fi

# 检查 non_empty_array 是否为空
if [ -z "${non_empty_array[*]}" ]; then
    echo "non_empty_array 是空的"
else
    echo "non_empty_array 不是空的"
fi

8. 获取cpu架构

在 shell 脚本中,可以使用 uname 命令来判断 CPU 的架构。uname 命令用于输出系统信息,其中包括硬件架构。要获取硬件架构,可以使用 uname -m 命令。

9. 读取管道传进来文本

在 shell 脚本中,可以使用 read 命令从管道中读取传入的文本。以下是一个示例,演示如何在 shell 脚本中读取从管道传入的文本:

bashCopy code
#!/bin/bash

# 从管道中读取传入的文本
while IFS= read -r input_line; do
  # 输出传入的文本
  echo "您传入的文本是:$input_line"
done

在这个示例中,我们使用 while 循环和 read 命令从管道中读取传入的文本。IFS= 用于保留空白字符,-r 选项用于防止反斜杠转义。对于从管道中读取的每一行文本,我们都会输出相应的内容。

10. 文字颜色、背景颜色

在 shell 中,可以使用 ANSI 转义序列来更改文本颜色和背景颜色。ANSI 转义序列是一种特殊的字符序列,用于控制终端的显示属性,如颜色、粗体、下划线等。

以下是一些常见的 ANSI 转义序列,用于更改文本颜色和背景颜色:

  • 文本颜色:
    • 黑色:\033[30m
    • 红色:\033[31m
    • 绿色:\033[32m
    • 黄色:\033[33m
    • 蓝色:\033[34m
    • 洋红色:\033[35m
    • 青色:\033[36m
    • 白色:\033[37m
  • 背景颜色:
    • 黑色:\033[40m
    • 红色:\033[41m
    • 绿色:\033[42m
    • 黄色:\033[43m
    • 蓝色:\033[44m
    • 洋红色:\033[45m
    • 青色:\033[46m
    • 白色:\033[47m

要在 shell 脚本中使用这些 ANSI 转义序列,请将它们与要显示的文本一起输出。例如,要输出红色文本,可以使用以下命令:

bashCopy code
echo -e "\033[31mThis is red text\033[0m"

在这个示例中,我们使用 -e 选项告诉 echo 命令解释转义序列。\033[31m 将文本颜色更改为红色,\033[0m 将颜色重置为默认值。

要同时更改文本颜色和背景颜色,可以将相应的转义序列组合在一起。例如,要输出白色文本和蓝色背景,可以使用以下命令:

bashCopy code
echo -e "\033[37;44mWhite text on a blue background\033[0m"

在这个示例中,我们将文本颜色的转义序列(\033[37m)和背景颜色的转义序列(\033[44m)组合在一起。请注意,这些转义序列之间用分号(;)分隔

11. shell 中给命令传入一个数组作为多参数

如果一个命令比如test [paths] test 命令可以传入至少一个path作为参数, 我们需要如下给test传入:

array=("path1", "path2", "path3")
test $(printf "%s " "${array[@]}")

12. 如何判断脚本是否在Bash shell中运行

-z "${BASH_VERSION:-}" 是一个 Bash 条件表达式,用于检查当前 shell 是否为 Bash。这个表达式的含义如下:

  • -z:这是一个测试运算符,用于检查字符串的长度是否为零。如果字符串长度为零,则返回真(true);否则返回假(false)。
  • "${BASH_VERSION:-}":这是一个参数扩展表达式,用于获取 BASH_VERSION 变量的值。如果 BASH_VERSION 变量未设置或为空,则使用空字符串替换。BASH_VERSION 变量在 Bash shell 中自动设置,包含当前 Bash 版本的信息。

因此,-z "${BASH_VERSION:-}" 表达式的含义是:如果 BASH_VERSION 变量为空(即字符串长度为零),则返回真(true);否则返回假(false)。换句话说,如果当前 shell 不是 Bash(即 BASH_VERSION 未设置),则此表达式为真(true)。

13. xargs 命令

xargs 用于从标准输入(stdin)读取数据,并将这些数据作为参数传递给别的命令。

-I 后跟一个字符串,用于指定一个占位符,xargs 从标准输入读取数据的时候,会将占位符替换成真正的数据。占位符可多次使用。

-P 后跟一个数组,用于指定并行执行的进程数量。

# CMD 是一个占位符
xargs -I CMD

# 最大并行执行进程为4个
xargs -I CMD -P 4

# eg.
echo "test1 test2 test3" | xargs -I CMD -P 4 echo "Processing: CMD"

# 输出:
# Processing: test1
# Processing: test2
# Processing: test3