[笔记] shell 脚本常用命令(I)
shell 脚本常用命令(I)
特殊的环境变量
PATH
PATH 是一个特殊的环境变量,用于指定可执行文件的搜索路径
当你在 Shell 中输入一个命令时,系统会在 PATH 中列出的路径列表中搜索该命令的可执行文件,并执行找到的第一个匹配文件。PATH 变量的值是一个由冒号 : 分隔的路径列表,每个路径代表一个可执行文件的搜索目录。
HOME
HOME:表示当前用户的主目录路径。在 Unix/Linux 系统中,每个用户都有一个主目录,用于存储该用户的文件和设置。HOME 环境变量通常被用于指定文件和数据的默认存储位置,以及一些应用程序的默认设置。
USER
USER:表示当前用户的用户名。USER 环境变量通常被用于标识当前用户,以及在一些脚本和应用程序中作为参数传递。
SHELL
SHELL:表示当前用户使用的 Shell 程序的路径。SHELL 环境变量通常被用于指定用户的默认 Shell 程序,以及在一些脚本和应用程序中作为参数传递。
PWD
PWD:表示当前工作目录的路径。PWD 环境变量通常被用于指定当前工作目录的路径,以及在一些脚本和应用程序中作为参数传递。
[图片]
LANG
LANG:表示当前系统使用的语言环境。LANG 环境变量通常被用于指定系统的默认语言环境,以及在一些应用程序中用于设置语言环境。
TMP/TEMP
TMP 或 TEMP:表示当前系统的临时文件目录路径。TMP 或 TEMP 环境变量通常被用于指定临时文件的默认存储位置,以及在一些应用程序中作为参数传递。
- 在执行 echo $TMP 命令时,如果返回的结果为空,通常可能是因为系统没有设置 TMP 环境变量,或者 TMP 环境变量的值为空。
- TMP 环境变量通常用来指定系统的临时文件目录路径,许多应用程序会使用该环境变量来创建和读写临时文件。但是并不是所有系统都默认设置了 TMP 环境变量,而且在某些情况下,即使设置了 TMP 环境变量,也可能出现其值为空的情况。
- 如果你想设置 TMP 环境变量,可以在命令行中使用 export 命令来设置。例如:
export TMP=/tmp
以下是一些常见的设置环境变量的文件:
- /etc/profile:这个文件包含了系统的全局配置,其中可以设置全局的环境变量。在该文件中添加 export TMP=/tmp 就可以设置 TMP 环境变量。
~/.bash_profile 或 ~/.bashrc:这些文件是用户的 Shell 配置文件,其中可以设置用户的个人环境变量。如果你使用的是 Bash Shell,可以在 ~/.bash_profile 或 ~/.bashrc 文件中添加 export TMP=/tmp 就可以设置 TMP 环境变量。
/etc/environment:这个文件包含了系统的全局环境变量,其中可以设置全局的环境变量。在该文件中添加 TMP=/tmp 就可以设置 TMP 环境变量。
LFS
$LFS 是一个环境变量,用于指定 Linux From Scratch (LFS) 系统的根目录。LFS 是一个完全自定义的 Linux 发行版,它的设计目的是让用户从头开始构建自己的 Linux 系统,包括构建工具链、内核和用户空间工具等。
- 在 LFS 系统中,$LFS 变量通常被设置为 LFS 系统的根目录,所有的工具链、库文件和可执行文件都被安装到该目录下。例如,如果您将 LFS 根目录设置为 “/mnt/lfs”,则 $LFS 变量将被设置为 “/mnt/lfs”。
- 在 LFS 系统的构建过程中,许多命令和脚本都会使用 $LFS 变量来引用 LFS 系统的根目录。例如,会使用 $LFS/tools 来引用 LFS 系统中的工具链目录,使用 $LFS/usr 来引用 LFS 系统中的用户空间目录等。
PS1
PS1:表示当前 Shell 程序的提示符字符序列。PS1 环境变量通常被用于自定义 Shell 程序的提示符,以便用户更好地控制 Shell 程序的外观和行为。
EDITOR
指定当前用户使用的文本编辑器。
- 当用户在Shell中输入"edit"或者"vi"等编辑命令时,系统会根据"EDITOR"变量的值来启动相应的文本编辑器。例如,如果"EDITOR"的值设置为"vim",则输入"edit"命令时会启动Vim编辑器。
- 在Unix和类Unix系统中,“EDITOR"环境变量通常被用于配置命令行界面下的编辑器,例如"vi”、“emacs”、"nano"等。同时,许多图形界面下的应用程序也会使用"EDITOR"环境变量来配置其默认的文本编辑器。
- 需要注意的是,"EDITOR"环境变量的值必须是一个可执行文件的路径,否则编辑器将无法启动。同时,不同的应用程序可能会使用不同的环境变量来配置其默认的文本编辑器,因此在使用"EDITOR"环境变量时需要注意其作用范围。
LC_ALL
指定当前用户使用的本地化环境。
- 在Unix和类Unix系统中,本地化环境用于指定日期、时间、货币、数字、字符集等的格式和显示方式。不同的本地化环境可能会使用不同的格式和显示方式,例如不同的日期格式、货币符号、小数点符号等。因此,在编写和运行脚本、程序等时,需要使用正确的本地化环境,以确保输出的结果符合用户的预期。
- "LC_ALL"环境变量可以用于覆盖其他本地化环境变量(如LANG、LC_COLLATE、LC_CTYPE等),从而统一指定所有本地化设置。例如,"export LC_ALL=en_US.UTF-8"会将所有的本地化设置都指定为美式英语环境,并使用UTF-8字符集。
DISPLAY
指定X Window系统的显示服务器。
TZ
指定当前用户所在的时区。
PAGER
指定当前用户使用的分页器。
写shell 脚本之前,要在文件开头#!/usr/bin/env bash 以此表明是bash
set -ex
set -ex 是一个Shell脚本中的命令,它用于设置shell脚本的执行选项。具体含义如下:
- “set -e” 表示如果脚本中有任何一个命令执行失败(返回非零值),则立即退出整个脚本,不再继续执行后续的命令。
- “set -x” 表示在执行脚本时,将会输出每个执行的命令及其参数,以便于调试和排查问题。
因此,“set -ex” 的组合选项表示在执行脚本时,如果有任何一个命令执行失败,脚本将会立即退出,并且在执行命令时,将会输出每个执行的命令及其参数,以便于调试和排查问题。
这个选项在编写较大的脚本或者调试复杂的脚本时非常有用,可以帮助你快速定位问题并进行调试。一般都是在写脚本#!/usr/bin/env bash开头后 下一行就是set -ex 之后在写脚本的内容
$
$ 符号通常用于引用变量的值,将其替换为变量的实际值。在这里,$PATH 中的 $ 符号表示将环境变量 PATH 的值替换为实际的路径列表。
- 变量声明和引用:在Shell中,使用" " 符号可以声明和引用变量。例如, "符号可以声明和引用变量。例如, "符号可以声明和引用变量。例如,VAR是引用一个名为VAR的变量的语法,而VAR=value是声明一个名为VAR的变量,并赋予它一个值value的语法。
- 命令替换:在Shell中,使用$(command)或command语法可以执行命令并将其结果替换为命令本身。例如,echo $(date)将输出当前日期和时间。
- 环境变量引用:在Shell中,使用" " 符号可以引用环境变量。例如, "符号可以引用环境变量。例如, "符号可以引用环境变量。例如,HOME是引用用户的主目录的语法。
- 数组引用:在Shell中,使用" " 符号可以引用数组元素。例如, "符号可以引用数组元素。例如, "符号可以引用数组元素。例如,{array[0]}引用名为array的数组的第一个元素。
- 字符串替换:在Shell中,使用 s t r i n g / o l d / n e w 语法可以将字符串 s t r i n g 中的所有旧子字符串替换为新子字符串。例如, {string/old/new}语法可以将字符串string中的所有旧子字符串替换为新子字符串。例如, string/old/new语法可以将字符串string中的所有旧子字符串替换为新子字符串。例如,{string/foo/bar}将字符串string中的所有“foo”替换为“bar”。
${}
在 Bash 脚本中,${} 是一种变量扩展语法,用于获取变量的值。通常 ${} 的形式为 ${variable},其中 variable 是一个变量的名称。
${} 语法可以用于以下情况:
- 获取变量的值:${variable} 可以用于获取指定变量的值,例如:echo ${HOME} 将输出当前用户的 home 目录路径。
- 在字符串中插入变量:${variable} 可以用于在字符串中插入变量的值,例如:echo “My name is ${HOME}” 将输出 “My name is” 后接当前用户的名称。
- 字符串操作: v a r i a b l e : o f f s e t : l e n g t h 可以用于从字符串的指定偏移量 o f f s e t 开始,截取指定长度 l e n g t h 的子字符串。例如: {variable:offset:length} 可以用于从字符串的指定偏移量 offset 开始,截取指定长度 length 的子字符串。例如: variable:offset:length可以用于从字符串的指定偏移量offset开始,截取指定长度length的子字符串。例如:{NAME:0:3} 将返回字符串 NAME 的前三个字符。
- 数组操作: a r r a y [ i n d e x ] 可以用于获取数组 a r r a y 中指定索引 i n d e x 的元素值。例如: {array[index]} 可以用于获取数组 array 中指定索引 index 的元素值。例如: array[index]可以用于获取数组array中指定索引index的元素值。例如:{arr[0]} 将返回数组 arr 的第一个元素。
- 命令替换: c o m m a n d 可以用于执行指定的命令,并将该命令的输出结果作为变量的值。例如: {command} 可以用于执行指定的命令,并将该命令的输出结果作为变量的值。例如: command可以用于执行指定的命令,并将该命令的输出结果作为变量的值。例如:{ls /} 将返回 / 目录下的所有文件和目录列表。
需要注意的是,${} 语法中的变量名不需要加上美元符号 $,但加上也不会影响变量扩展的效果。
$()
"$()"是在Unix和类Unix系统中常见的一种命令替换语法。它用于将一个或多个命令的输出作为参数传递给另一个命令或者赋值给一个变量。
- 具体来说,"$()"语法会将括号中的命令视为一个子进程,在子进程中执行该命令,并将输出结果作为字符串返回。这个字符串可以用于作为另一个命令的参数,例如
echo "The current date is $(date)" //输出当天的日期
- 另外,"$()"语法也可以用于将命令的输出赋值给一个变量,例如:
files=$(ls *.txt)
( ) 和 ()和 ()和{}"是在Unix和类Unix系统中常见的两种语法,它们的作用有些相似,但还是有一些区别。
- " ( ) " 语法用于命令替换,而 " ()"语法用于命令替换,而" ()"语法用于命令替换,而"{}"语法用于变量替换。
$() 语法会将括号中的命令视为一个子进程,在子进程中执行该命令,并将输出结果作为字符串返回。
而${}语法用于在字符串中引用变量,并将其替换为相应的值。例如:
files=$(ls *.txt)
echo "There are ${#files} .txt files in the current directory."
这个命令会将当前目录中所有以".txt"结尾的文件名赋值给"files"变量,并输出该目录下".txt"文件的数量。
- " ( ) " 语法可以嵌套使用,而 " ()"语法可以嵌套使用,而" ()"语法可以嵌套使用,而"{}"语法不能嵌套使用。
"$()"语法可以嵌套使用,例如:
echo "The current date is $(date +%Y-%m-%d)"
这个命令会在字符串中插入当前日期,并以"YYYY-MM-DD"的格式输出该字符串。
而"${}"语法不能嵌套使用,例如:
echo "The current user is ${USER:-$(whoami)}"
这个命令的意思是,如果"USER"变量存在,则使用它的值作为当前用户,否则使用"whoami"命令输出当前用户。如果尝试在" " 语法中嵌套 " {}"语法中嵌套" "语法中嵌套"()"语法,则可能会出现语法错误。
$@
$@ 表示当前位置参数列表中的所有参数,即所有传递给脚本的参数。
- 具体来说,当您在 Shell 脚本中使用 $@ 时,它会将所有传递给脚本的参数作为一个参数列表返回。这个参数列表可以使用循环或其他方法进行遍历和处理。
例如,以下示例脚本将输出传递给它的所有参数:
#!/bin/bash
for arg in "$@"
do
echo "Argument: $arg"
done
在执行此脚本时,您可以通过在脚本名称后面添加参数来传递参数,例如:
./script.sh arg1 arg2 arg3
这将输出:
Argument: arg1
Argument: arg2
Argument: arg3
" "
双引号则是一种在Unix和类Unix系统中常见的字符串表示方式,用于将字符串中的变量和转义字符解析为其值。
- 具体来说,当使用双引号括起来的字符串作为"echo"命令的参数时,双引号内的内容会被解析为字符串,并将其中的变量和转义字符转换为其实际值,例如:
echo "The current user is $USER"
这个命令会输出"The current user is"和当前用户的用户名。在这个命令中,"$USER"是一个环境变量,它的值会被解析为当前用户的用户名。
- 另外,使用双引号还可以在字符串中插入特定的字符,例如:
- 双引号本身可以使用转义字符"“来表示,例如:”“hello”"
- 换行符可以使用"\n"表示,例如:“Hello\nWorld”
- 制表符可以使用"\t"表示,例如:“Hello\tWorld”
- 需要注意的是,在使用双引号时,如果字符串中包含特殊字符,例如"$"等,它们可能会被解析为变量或命令替换符号,因此需要使用转义字符进行转义,例如:
echo "The current date is \`date\`"
这个命令会输出"The current date is "和当前日期。在这个命令中,"date"是一个命令替换符号,它会被解析为当前日期。为了避免它被解析为命令替换符号,需要使用反斜杠进行转义。
()
():用于创建子 shell,也称为子进程。
- 例如,以下示例使用 () 创建一个子 shell,在子 shell 中执行一个命令:
(cd /tmp && ls)
该示例使用 () 创建一个子 shell,使用 cd 命令切换到 /tmp 目录,然后使用 ls 命令列出 /tmp 目录下的文件名。由于子 shell 和父 shell 是相互独立的,因此该示例执行完后,当前工作目录并没有改变。
- 子 shell 还可以用于创建新的环境变量,例如,以下示例使用 () 创建一个子 shell,并在子 shell 中设置一个新的环境变量 MY_VAR:
(MY_VAR="Hello World"; echo $MY_VAR)
该示例使用 () 创建一个子 shell,在子 shell 中使用 MY_VAR=“Hello World” 设置一个新的环境变量 MY_VAR,然后使用 echo 命令输出该变量的值。由于子 shell 和父 shell 是相互独立的,因此该示例执行完后,父 shell 中并没有 MY_VAR 这个环境变量。
- 使用 () 创建子 shell 可以提高脚本编写的灵活性和效率,但也需要注意一些细节问题,例如,子 shell 中的变量和环境变量不会传递到父 shell 中,因此需要谨慎使用。
export
在 Bash 脚本中,export 是一个命令,用于设置环境变量并将其导出到子进程的环境中。export 命令通常用于在当前 Shell 进程中设置环境变量,以便其他进程或子进程能够访问这些变量。
- export 命令的基本语法如下:
export VAR=value
其中,VAR 是要设置的环境变量名,value 是该环境变量的值。如果 value 是一个字符串,需要用双引号或单引号将其括起来,以避免被 Shell 解释器解释。如果 value 是一个命令或变量,需要在 $() 或 中使用命令替换或变量替换语法,以获取命令或变量的值。
- 除了单独设置环境变量之外,export 命令还可以用于一次性设置多个环境变量,如下所示:
export VAR1=value1 VAR2=value2 ...
这样可以一次性设置多个变量。
- 需要注意的是,export 命令设置的环境变量只在当前 Shell 进程和其子进程中有效,不会影响其他进程或 Shell 会话。如果需要在所有 Shell 会话中设置环境变量,可以将 export 命令添加到 Shell 配置文件(如 ~/.bashrc 或 /etc/profile)中。
%.
"%.“表示从字符串结尾处开始匹配,这个语法是一种常见的bash字符串处理方式,称为"参数替换”,可以用于从字符串中截取子串或者替换指定的字符串。
eg: "${WORKSPACE%.git}" 表示去掉变量WORKSPACE中的".git"后缀
pushd、popd
“pushd” 是一个bash shell中的命令,用于切换当前目录并将当前目录压入目录栈中,以便后续可以使用"popd"命令将当前目录弹出栈并返回到原来的目录。
- 具体来说,pushd 命令的语法如下:
pushd [目录路径]
其中,目录路径是需要切换到的目录,如果省略则默认切换到当前用户的主目录。
-
执行 pushd 命令后,它会将当前目录压入一个目录栈中,并将目录切换到指定的目录。同时,它会输出栈中的所有目录,以及当前目录的路径。
-
pushd 命令可以多次调用,每次调用都会将当前目录压入目录栈中,并切换到指定的目录。
“popd” 是一个bash shell中的命令,用于从目录栈中弹出最近一次压入的目录,并切换到该目录。
- popd 命令的语法如下:
popd [-n] [-q] [目录路径]
其中,选项和参数的含义如下:
- “-n” 选项表示不切换目录,只将目录从栈中弹出;
- “-q” 选项表示不输出目录栈的状态信息;
- “目录路径” 参数表示从目录栈中删除指定的目录路径。
- 执行 popd 命令时,它会从目录栈中弹出最近一次压入的目录,并切换到该目录。同时,它会输出栈中的所有目录,以及当前目录的路径。如果指定了"-n"选项,则不会切换目录,只将目录从栈中弹出。如果指定了"-q"选项,则不会输出目录栈的状态信息。如果同时指定了"目录路径"参数,则会从目录栈中删除指定的目录路径。
- 需要注意的是,popd 命令只能弹出目录栈中最近一次压入的目录,如果需要弹出其他目录,则需要通过多次调用 popd 命令来实现。同时,popd 命令也只能操作目录栈中的目录,不能操作文件等其他类型的路径。
目录栈(Directory Stack)是一个bash shell中的内置变量,用于存储目录切换的历史记录。
目录栈中存储了从当前目录到之前的目录切换的完整路径,每个路径都有一个对应的数字索引。可以使用"dirs"命令查看目录栈中的所有目录路径及索引。目录栈的使用可以方便地在不同的目录之间切换,并记录目录的历史记录,避免了手动切换目录时可能出现的错误。它在命令行操作和脚本编程中都有很多实际应用场景。
在bash shell中,可以使用"pushd"和"popd"命令来操作目录栈。"pushd"命令用于将当前目录压入目录栈,并切换到指定的目录;"popd"命令用于将目录栈中最近一次压入的目录弹出,并切换到该目录。同时,这两个命令还支持一些选项和参数,可以用于在目录栈中查找、删除或重排目录路径。