Administrator
发布于 2024-12-27 / 33 阅读
0
0

Shell教程

参考:https://www.runoob.com/linux/linux-tutorial.html

变量

# 显式定义变量,等号前后不能出现空格
num=1
echo $num
# 除了显式地直接赋值,还可以用语句给变量赋值,如:
for file in `ls /etc` 或 for file in $(ls /etc)
# 只读变量
myUrl="https://www.google.com"
readonly myUrl
# 删除变量
unset variable_name

变量类型

运行shell时,会同时存在三种变量:
1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

字符串

# 单引号
## 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
## 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用str='this is a string'

# 双引号
## 双引号里可以有变量
## 双引号里可以出现转义字符your_name="zs"str="Hello, I know you are \"$your_name\"! \n"echo -e $str# 输出结果Hello, I know you are "zs"! 
# 获取字符串长度string="abcd"echo ${#string}   # 输出 4
# 提取字符串string="test is a great site"echo ${string:1:2} # 输出 es
# 查找子字符串string="test is a great site"echo `expr index "$string" e`  # 查找i或o出现的位置

数组

# 定义数组名=(值1 值2 ... 值n) 或 
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
# 示例array_name=(value0 value1 value2 value3)
# 读取${数组名[下标]}
# 示例valuen=${array_name[n]}
# 使用 @ 符号可以获取数组中的所有元素,例如:echo ${array_name[@]}
# 获取数组的长度
## 取得数组元素的个数length=${#array_name[@]}# 或者length=${#array_name[*]}
## 取得数组单个元素的长度lengthn=${#array_name[n]}

参数传递

参数说明

参数

说明

$#

传递到脚本的参数个数

$*

以一个单字符串显示所有向脚本传递的参数。 如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

$$

脚本运行的当前进程ID号

$!

后台运行的最后一个进程的ID号

$@

与$*相同,但是使用时加引号,并在引号中返回每个参数。 如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

$-

显示Shell使用的当前选项,与set命令功能相同。

$?

显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

示例

#! /bin/bash
echo "参数个数 $#"
if (("$#" > 5)); then  
  echo "参数个数大于5"
else  
  echo "参数个数小于等于5"
fi

for item in "$*"; do  
  echo "所有参数 $item"
done

counter=1
for item in "$@"; do  
  echo "参数$counter $item"  
  let "counter++"
done

test 命令

# test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试

数值测试

参数

说明

-eq

等于则为真

-ne

不等于则为真

-gt

大于则为真

-ge

大于等于则为真

-lt

小于则为真

-le

小于等于则为真

num1=100
num2=100
if test $[num1] -eq $[num2] then    
  echo '两个数相等!'
else    
  echo '两个数不相等!'
fi

字符串测试

参数

说明

=

等于则为真

!=

不相等则为真

-z 字符串

字符串的长度为零则为真

-n 字符串

字符串的长度不为零则为真

num1="ru1noob"
num2="runoob"
if test $num1 = $num2 then    
  echo '两个字符串相等!'
else    
  echo '两个字符串不相等!'
fi

文件测试

说明

-e 文件名

如果文件存在则为真

-r 文件名

如果文件存在且可读则为真

-w 文件名

如果文件存在且可写则为真

-x 文件名

如果文件存在且可执行则为真

-s 文件名

如果文件存在且至少有一个字符则为真

-d 文件名

如果文件存在且为目录则为真

-f 文件名

如果文件存在且为普通文件则为真

-c 文件名

如果文件存在且为字符型特殊文件则为真

-b 文件名

如果文件存在且为块特殊文件则为真

# 文件是否存在
cd /bin 
if test -e ./bash then    
  echo '文件已存在!'
else    
  echo '文件不存在!'
fi
# 另外,Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。例如:cd /binif test -e ./notFile -o -e ./bashthen    echo '至少有一个文件存在!'else    echo '两个文件都不存在'fi

流程控制

if-else判断

if condition then    ...elif    ...else    ...fi
# 或者if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
# if else 的 [...] 判断语句中大于使用 -gt,小于使用 -ltif [ "$a" -gt "$b" ]; then    ...fi
# 如果使用 ((...)) 作为判断语句,大于和小于可以直接使用 > 和 <if (( a > b )); then    ...fi

for循环

# for循环for var in item1 item2 ... itemNdo    ...done
# 或者for var in item1 item2 ... itemN; do command1; command2… done;
## 示例:
for var in 1..10
do    
  echo $var
done

for str in This is a string
do    
  echo $str
done

while循环

while conditiondo    commanddone
## 示例:
int=1
while(( $int<=5 ))do    
  echo $int    
  let "int++"
done

until 循环

# 满足条件时停止until conditiondo    commanddone
## 示例:
a=0
until [ ! $a -lt 10 ]
do   
  echo $a   a=`expr $a + 1`
done

无限循环

while :do    commanddone
# 或者
while true do    commanddone# 或者for (( ; ; ))

函数

定义

# 函数的定义,参数参考参数传递
[ function ] funname [()]{    
    # action;    [return int;]
}

示例

#!/bin/bash
function demoFun1(){    
  echo "这是我的第一个 shell 函数!"    return `expr 1 + 1`
}
demoFun1
echo $?
echo $?
# 结果展示这是我的第一个 shell 函数!20

文件包含

. filename   # 注意点号(.)和文件名中间有一空格或source filename

示例

## test1.sh#!/bin/bashurl="http://www.runoob.com"
## test2.sh#!/bin/bash#使用 . 号来引用test1.sh 文件. ./test1.sh
# 或者使用以下包含文件代码# source ./test1.sh
echo "菜鸟教程官网地址:$url"
# 执行并展示./test2.sh菜鸟教程官网地址:http://www.runoob.com
# 注:被包含的文件 test1.sh 不需要可执行权限。

命令

grep命令

# grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用,使用上十分灵活。
# 常见用法## 示例:在文件中搜索一个单词,命令会返回一个包含 “match_pattern” 的文本行:grep match_pattern file_namegrep "match_pattern" file_name

选项

-a --text  # 不要忽略二进制数据。
-A <显示行数>  --after-context=<显示行数>   # 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b --byte-offset                           # 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-B<显示行数>   --before-context=<显示行数>   # 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c --count    # 计算符合范本样式的列数。
-C<显示行数> --context=<显示行数>或-<显示行数> # 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> --directories=<动作>  # 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> --regexp=<范本样式>   # 指定字符串作为查找文件内容的范本样式。
-E --extended-regexp             # 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> --file=<规则文件>     # 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F --fixed-regexp   # 将范本样式视为固定字符串的列表。
-G --basic-regexp   # 将范本样式视为普通的表示法来使用。
-h --no-filename    # 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H --with-filename  # 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i --ignore-case    # 忽略字符大小写的差别。
-l --file-with-matches   # 列出文件内容符合指定的范本样式的文件名称。
-L --files-without-match # 列出文件内容不符合指定的范本样式的文件名称。
-n --line-number         # 在显示符合范本样式的那一列之前,标示出该列的编号。
-P --perl-regexp         # PATTERN 是一个 Perl 正则表达式
-q --quiet或--silent     # 不显示任何信息。
-R/-r  --recursive       # 此参数的效果和指定“-d recurse”参数相同。
-s --no-messages  # 不显示错误信息。
-v --revert-match # 反转查找。
-V --version      # 显示版本信息。   
-w --word-regexp  # 只显示全字符合的列。
-x --line-regexp  # 只显示全列符合的列。
-y # 此参数效果跟“-i”相同。
-o # 只输出文件中匹配到的部分。
-m <num> --max-count=<num> # 找到num行结果后停止查找,用来限制匹配行数

规则表达式

^    # 锚定行的开始 如:'^grep'匹配所有以grep开头的行。    
$    # 锚定行的结束 如:'grep$' 匹配所有以grep结尾的行。
.    # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。    
*    # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。    
.*   # 一起用代表任意字符。   
[]   # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。    
[^]  # 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。    
\(..\)  # 标记匹配字符,如'\(love\)',love被标记为1。    
\<      # 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。    
\>      # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。    
x\{m\}  # 重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。    
x\{m,\}   # 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。    
x\{m,n\}  # 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。   
\w    # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。   
\W    # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。   
\b    # 单词锁定符,如: '\bgrep\b'只匹配grep。

示例

# 在多个文件中查找:grep "match_pattern" file_1 file_2 file_3 ...
输出除之外的所有行 -v 选项:grep -v "match_pattern" file_name
标记匹配颜色 --color=auto 选项:grep "match_pattern" file_name --color=auto
使用正则表达式 -E 选项:grep -E "[1-9]+"# 或egrep "[1-9]+"
使用正则表达式 -P 选项:grep -P "(\d{3}\-){2}\d{4}" file_name
只输出文件中匹配到的部分 -o 选项:echo this is a test line. | grep -o -E "[a-z]+\."line.
echo this is a test line. | grep -o "[a-z]+\."line.
# 统计文件或者文本中包含匹配字符串的行数 -c 选项:grep -c "text" file_name
输出包含匹配字符串的行数 -n 选项:grep "text" -n file_name# 或cat file_name | grep "text" -n
#多个文件grep "text" -n file_1 file_2打印样式匹配所位于的字符或字节偏移:
echo gun is not unix | grep -b -o "not"7:not#一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项  **-b -o**  一般总是配合使用。
搜索多个文件并查找匹配文本在哪些文件中:grep -l "text" file1 file2 file3...
grep递归搜索文件在多级目录中对文本进行递归搜索:grep "text" . -r -n# .表示当前目录。
忽略匹配样式中的字符大小写:echo "hello world" | grep -i "HELLO"# hello
选项 -e 制动多个匹配样式:echo this is a text line | grep -e "is" -e "line" -oisline
#也可以使用 **-f** 选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。cat patfileaaabbbecho aaa bbb ccc ddd eee | grep -f patfile -o
# 在grep搜索结果中包括或者排除指定文件:# 只在目录中所有的.php和.html文件中递归搜索字符"main()"grep "main()" . -r --include *.{php,html}
# 在搜索结果中排除所有README文件grep "main()" . -r --exclude "README"
# 在搜索结果中排除filelist文件列表里的文件grep "main()" . -r --exclude-from filelist
# 使用0值字节后缀的grep与xargs:# 测试文件:echo "aaa" > file1echo "bbb" > file2echo "aaa" > file3grep "aaa" file* -lZ | xargs -0 rm# 执行后会删除file1和file3,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。
grep静默输出:grep -q "test" filename# 不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。

sed命令

sed 是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed [options] 'command' file(s)sed [options] -f scriptfile file(s)
-e<script>或--expression=<script>:以选项中的指定的script来处理输入的文本文件;
-f<script文件>或--file=<script文件>:以选项中指定的script文件来处理输入的文本文件;
-h或--help:显示帮助;
-n或--quiet或——silent:仅显示script处理后的结果;
-V或--version:显示版本信息。

命令

a\ # 在当前行下面插入文本。
i\ # 在当前行上面插入文本。
c\ # 把选定的行改为新的文本。
d # 删除,删除选择的行。
D # 删除模板块的第一行。
s # 替换指定字符
h # 拷贝模板块的内容到内存中的缓冲区。
H # 追加模板块的内容到内存中的缓冲区。
g # 获得内存缓冲区的内容,并替代当前模板块中的文本。
G # 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l # 列表不能打印字符的清单。
n # 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N # 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p # 打印模板块的行。
P # (大写) 打印模板块的第一行。
q # 退出Sed。
b lable # 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file # 从file中读行。
t label # if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label # 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file # 写并追加模板块到file末尾。  
W file # 写并追加模板块的第一行到file末尾。  
! # 表示后面的命令对所有没有被选定的行发生作用。  
= # 打印当前行号码。  
# # 把注释扩展到下一个换行符以前。  

替换标记

g # 表示行内全面替换。  
p # 表示打印行。  
w # 表示把行写入一个文件。  
x # 表示互换模板块中的文本和缓冲区中的文本。  
y # 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 # 子串匹配标记
& # 已匹配字符串标记

元字符集

^ # 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ # 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. # 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* # 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] # 匹配一个指定范围内的字符,如/[sS]ed/匹配sed和Sed。  
[^] # 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\) # 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
& # 保存搜索字符用来替换其他字符,如s/love/ **&** /,love这成 **love** 。
\< # 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\> # 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\} # 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\} # 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\} # 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。  

示例

# 插入(行上):i\命令# 将 this is a test line 追加到以test开头的行前面:sed '/^test/i\this is a test line' file
#在test.conf文件第5行之前插入this is a test line:sed -i '5i\this is a test line' test.conf
# 第二行后追加sed -i "2a\1 2 3 4 5 6 7" a.txt
# 替换(示例:关闭selinux)sed -i 's/enforcing/disabled/' /etc/selinux/config
# 第1行到第3行小写替换成大写sed -i '1,3y/abcdefg/ABCDEFG/' a.txt
# 删除空白行sed -i '/^$/d' file
# 删除第2行到末尾所有行sed -i '2,$d' file
# 删除所有test开头的行sed -i '/^test/'d file
# 多次处理sed -e '1,5d' -e 's/test/check/' file
# 打印奇偶行sed -n '1~2p' test.txt  #奇数行sed -n '2~2p' test.txt  #偶数行

awk命令

awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

命令格式和选项

# 语法形式awk [options] 'script' var=value file(s)awk [options] -f scriptfile var=value file(s)
# 常用命令选项-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:,默认的分隔符是连续的空格或制表符-v var=value 赋值一个用户定义变量,将外部变量传递给awk-f scripfile 从脚本文件中读取awk命令-m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

模式和操作

awk脚本是由模式和操作组成的。
模式模式可以是以下任意一个:
/正则表达式/:使用通配符的扩展集。关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。
模式匹配表达式:用运算符~(匹配)和!~(不匹配)。
BEGIN语句块、pattern语句块、END语句块:参见awk的工作原理操作操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是:变量或数组赋值输出命令内置函数控制流语句

脚本基本结构

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被 单引号 或 双引号 中,例如:
awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename
awk "BEGIN{ i=0 } { i++ } END{ print i }" filename

工作原理

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
第一步:执行BEGIN{ commands }语句块中的语句;
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{ commands }语句块。
BEGIN语句块* 在awk开始从输入流中读取行 之前 被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
END语句块* 在awk从输入流中读取完所有的行 之后 即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
pattern语句块* 中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。
# 示例
echo -e "A line 1\nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }'StartA line 1A line 2End

示例

cat a.txt
1 2 3 4 5 6 7
7 B C D E F 7
1 2 3 4 5 6 7
awk '{print $2}' a.txt 
2
B
2

awk '{print $2}' a.txt | xargs -n3
2 
B 
2

xargs命令

xargs 命令 是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs 能够处理管道或者 stdin 并将其转换成特定命令的命令参数。xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。xargs 的默认命令是 echo,空格是默认定界符。这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。xargs 是构建单行命令的重要组件之一。
xargs 命令用法xargs 用作替换工具,读取输入数据重新格式化后输出。

示例

# 定义一个测试文件,内有多行文本数据:
cat test.txt
a b c d e f g
h i j k l m n
o p q r s t u 
v w x y z
# 多行输入单行输出:cat test.txt | xargs a b c d e f g h i j k l m n o p q r s t u v w x y z
# 使用 -n 进行多行输出#
# 使用 -n 进行多行输出:cat test.txt | xargs -n3
# 使用 -d 分割输入
## -d 选项 可以自定义一个定界符:echo "nameXnameXnameXname" | xargs -dXname name name name
# 结合 -n 选项 使用:echo "nameXnameXnameXname" | xargs -dX -n2name namename name

# 读取 stdin## 读取 stdin,将格式化后的参数传递给命令# 假设一个命令为 sk.sh 和一个保存参数的文件 arg.txt:#!/bin/bash#sk.sh 命令内容,打印出所有参数。echo $*
# arg.txt 文件内容:cat arg.txtaaabbbccc
#结合 -I 选项## xargs 的一个 选项 -I ,使用 -I 指定一个替换字符串{},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次:cat arg.txt | xargs -I {} ./sk.sh -p {} -l-p aaa -l-p bbb -l-p ccc -l
# 复制所有图片文件到 /data/images 目录下:ls *.jpg | xargs -n1 -I cp {} /data/images
# 结合 find 命令使用## xargs 结合 find 使用# 示例:用 rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用 xargs 去避免这个问题:find . -type f -name "*.log" -print0 | xargs -0 rm -f
# xargs -0 将 \0 作为定界符。## 示例:统计一个源代码目录中所有 php 文件的行数:find . -type f -name "*.php" -print0 | xargs -0 wc -l
# 查找所有的 jpg 文件,并且压缩它们:find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
# 打印出执行的命令## 结合 -t 选项可以打印出 xargs 执行的命令ls | xargs -t -I{} echo {}# 会输出当前目录下的文件列表和执行的 echo 命令
# 使用 -p 选项确认执行的命令## -p 选项会在执行每一个命令时弹出确认,当你需要非常准确的确认每一次操作时可以使用 -p 参数,比如,查找当前目录下 .log 文件,每一次删除都需要确认:find . -maxdepth 1 -name "*.log" | xargs -p -I{} rm {}
# 执行多个命令使用 -I 选项可以让 xargs 执行多个命令
cat foo.txtonetwothree
cat foo.txt | xargs -I % sh -c 'echo %; mkdir %'onetwothree
lsone two three
# 其他应用## xargs 其他应用# 示例:假如你有一个文件包含了很多你希望下载的 URL,你能够使用 xargs 下载所有链接:cat url-list.txt | xargs wget -c
# 子 Shell(Subshells)运行一个 shell 脚本时会启动另一个命令解释器.,就好像你的命令是在命令行提示下被解释的一样,类似于批处理文件里的一系列命令。每个 shell 脚本有效地运行在父 shell(parent shell) 的一个子进程里。这个父 shell 是指在一个控制终端或在一个 xterm 窗口中给你命令指示符的进程。
cmd1 | ( cmd2; cmd3; cmd4 ) | cmd5如果 cmd2 是 cd /,那么就会改变子 Shell 的工作目录,这种改变只是局限于子 shell 内部,cmd5 则完全不知道工作目录发生的变化。子 shell 是嵌在圆括号 () 内部的命令序列,子 Shell 内部定义的变量为局部变量。


评论