Shell常用命令

一说到命令行,我们真正指的是 shell。

shell 就是一个程序,它接受从键盘输入的命令, 然后把命令传递给操作系统去执行。

 

下面对于一些特殊符号,特殊操作符和注意事项做一些记录。

目录

1.$0,$1,$2.....$#的含义

1).$0

2).$1~$n 

3).$#

4)上级目录$(dirname "$PWD")

2.比较操作符

1)整数比较

2)字符串比较 

3)前面加x

3.重定向

5.定义变量不要有空格

7.在一行执行多条命令

8.判断条件

9.mount,cd,ls,cp

10.shopt 显示linux行为命令

11.文件编码格式的转换 iconv

12.处理文件名中的空格,可以正常显示带空格文件名

13.在shell中调用vim

14.awk,grep,find,cat,tr

awk

grep

find

cat

tr

PS:一些小脚本

1.批量去除文件名中的空格

2.输入有空格的文件名到文本中

3.读取文本中每一行(行中带有空格也行)


1.$0,$1,$2.....$#的含义

用于读取输入参数。

1).$0

Shell本身的文件名。test.sh:

1cd `dirname $0`   2

含义为:用于取得脚本文件.sh 所在目录,然后将当前目录切换过去

ps:

1` ```` `
反引号 等同于$() ,  用于命令替换

命令替换是指 shell 可以先执行命令,将输出结果暂时保存,在适当的地方输出

下面例子用的 $() 进行命令替换

1files = $(ls *.txt) 2 3for filename in $files 4do 5 echo "$filename" 6done 7

for循环语法:

for 变量 in 取值列表
do
各种操作
done

2).$1~$n 

添加到Shell的各参数值。$1是第1参数、$2是第2参数…。test.sh: 

1cd `dirname $0` 2python test.py $1 $2 $3 3

3).$#

参数个数,从$1开始算,不算$0

 

4)上级目录$(dirname "$PWD")

比如:

$(dirname "$PWD")/tmp/文件名

tmp 这个文件夹一定要存在,如果不存在,就会说没有此目录。文件名可以不存在的。


2.比较操作符

用于比较数值大小以及字符串大小,有的比较操作符只能用 单词简写,有的比较操作符也可以用 对应的符号 来标识。注意区分数值大小 和 字符串大小的 是否相等是如何比较的。

[]中写判断条件

(())

" "

$

1)整数比较

1等于 2-eq ,如:if [ "$a" -eq "$b" ] 3 4不等于 5-ne ,如:if [ "$a" -ne "$b" ] 6 7大于 8-gt ,如:if [ "$a" -gt "$b" ] 9> (需要双括号),如:if(("$a" > "$b")) 10 11大于等于 12-ge ,如:if [ "$a" -ge "$b" ] 13>= (需要双括号),如:if(("$a" >= "$b")) 14 15小于 16-lt ,如:if [ "$a" -lt "$b" ] 17< (需要双括号),如:if(("$a" < "$b")) 18 19小于等于 20-le ,如:if [ "$a" -le "$b" ] 21<= (需要双括号),如:if(("$a" <= "$b")) 22 23 24 25

2)字符串比较 

1= 等于,如:if [ "$a" = "$b" ] 2== 等于,如:if [ "$a" == "$b" ],与=等价 3!= 不等于,如:if [ "$a" != "$b" ] 4

 

3)前面加x

1if [ x"$1" == x"a" ];then 2 echo right 3else 4 echo wrong 5fi 6

为什么比较前面要加x:

在一些UNIX系统:变量比较的时候,如果变量为空,或者未定义,这样会引起错误。

 


3.重定向

重定向是很常用的一个功能,来定制我们想要输入或者输出的地方。

介绍下在shell脚本中的三个文件。默认情况下,这三个文件处于打开状态:

  • 标准输入文件(stdin,默认标准输入文件为键盘输入)----文件描述符是0   
  • 标准输出文件(stdout,默认标准输出文件为屏幕)----文件描述符是1   
  • 标准错误文件(stderr,默认标准错误文件为屏幕)----文件描述符是2 

 

关于重定向的符号:

  • 输出文件重定向符号 1>  (也可以简写为>)  

比如输出重定向到 file 文件,command > file,或者 command 1> file 

如果直接command,那么就是输出到屏幕中。

  • 错误文件重定向符号 2> 

command 2 > file:错误信息重定向到 file文件

  • 输出文件和错误文件统一重定向

command > file 2>&1:错误和输出都重定向到 file文件(command > file 表示输出重定向到file, 2>&1表示错误返回值传递给1输出通道,即file)

 或者

command &> file:&>file  意思是把标准输出 和 标准错误 都重定向到文件file中

 

 

ps:/dev/null是一个文件,这个文件比较特殊,所有传给它的东西它都丢弃掉。

.


5.定义变量不要有空格

mobileprovision_uuid=

1mobileprovision_uuid=`/usr/libexec/PlistBuddy -c "Print UUID" /dev/stdin <<< $(/usr/bin/security cms -D -i ${local_path}${certificateName})` 2echo ${mobileprovision_uuid} > ${WORKSPACE}/iOSProvisionCode.txt 3

ps:

1.PlistBuddy是Mac自带的专门解析plist的小工具,**“Print ”**代表 打印字段相应的值,这里指的是打印出 **“UUID”**字段的值 

2.

1` ```` `
反引号 等同于$() ,  用于命令替换

**3. <<< **https://unix.stackexchange.com/questions/80362/what-does-mean

**4.**连接字符串 ${var1}${var2}

5.command > .txt 输出重定向


7.在一行执行多条命令

&&

第2条命令只有在第1条命令成功执行(产生了0退出码)之后才执行

 

||

第2条命令只有在第1条命令**执行失败(产生了一个非0的退出码)**之后才执行

 

;

第2条命令在第1条命令执行完(不管是否成功)才执行

1if [ 条件判断语句 ];then 2else 3fi 4

8.判断条件

语法:

1if [ 条件判断语句 ];then 2else 3fi 4

 具体例子

1if [ ${HotUpdateResource} = "true" ];then 2 \cp -f ${WORKSPACE}/Release/android/**/*.zip /Users/banben/workspace/${upftpjob}/ 3 \cp -f /Users/banben/workspace/${upftpjob}/*Android.zip /Users/banben/workspace/upyunwei 4else 5 echo "HotUpdateResource is false" 6fi 7

ps:

  1. \cp  直接拷贝覆盖不提示

9.mount,cd,ls,cp

mount: 查看当前挂在

cd: 移动到其他挂载

ls: 当前目录下的目录 (ls -l == ll )

cp:复制文件 cp oldfile newfile

#:注释

wc -l:统计输出的行数

sort -n test.txt | uniq: 去掉重复的行


10.shopt 显示linux行为命令

http://man.linuxde.net/shopt

查看当前的行为命令:比如 nocaseglob  为 off 就是 大小写敏感。

如何开启:

shopt -s nocaseglob

有什么用:

ls .txt 

如果nocaseglob选项是关闭的,就是搜出 txt的

如果nocaseglob选项是开启的,就是搜出 txt TXT 等都能匹配


11.文件编码格式的转换 iconv

iconv -f encoding [-t encoding] [inputfile]...

//IGNORE 忽略翻译不过来的的字符

find . -name $filename | xargs -I{} iconv -f GB2312 -t UTF-8//IGNORE {} -o $filename.text

如果 没有-o,就使用 >


12.处理文件名中的空格,可以正常显示带空格文件名

一般输入指令的时候,带空格文件名都要用 ' ' 括起来。

1SAVEIFS=$IFS 2IFS=$(echo -en "\n\b") 3for f in * 4do 5 echo "$f" 6done 7IFS=$SAVEIFS 8

https://blog.csdn.net/u014717036/article/details/71105018


13.在shell中调用vim

vim -b 文件名<<-!

:s/old/new

:wq

!

https://blog.csdn.net/xxxxxx91116/article/details/7478117


14.awk,grep,find,cat,tr

Windows下Git Bash显示中文问题 https://www.jianshu.com/p/04f1c40c7f17

awk

删除每行的最后10个字符

awk '{sub(/.{10}$/,"")}1' test.unl  

grep

在文件中 搜索文件内容

grep -l  -i “string” *.txt

-l 列出文件内容符合指定的范本样式的文件名称。

-i 忽略字符大小写的区别

-r 递归遍历文件夹下面的文件

find

在目录下查找文件名的命令,比如查看空格

files=$(find . -name "* *")

cat

连接文件并打印到标准输出设备

经常用来显示文件内容

tr

可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。

tr -d ' '  去除空格


PS:一些小脚本

1.批量去除文件名中的空格

1SAVEIFS=$IFS 2IFS=$(echo -en "\n\b") 3files=`find . -name "* *"` 4for name in $files 5do 6 echo "$name" 7 newname=$(echo $name | tr -d " ") 8 mv "$name" $newname 9done 10IFS=$SAVEIFS 11

2.输入有空格的文件名到文本中

当前目录

ls|grep " " > 1.txt 一行一行输入的是是文件名。

在ls的输出中 抓取有空格的文本 然后输入到1.txt 中

====================================

当前目录 以及子目录

find命令

find . -name "* *" -print > 2.txt 输入的文件名的区别 ./ 带有这种路径的。

3.读取文本中每一行(行中带有空格也行)

1SAVEIFS=$IFS 2IFS=$(echo -en "\n\b") 3lines=$(cat 文件名) 4for line in $lines 5do 6 echo $line$ 7done 8IFS=$SAVEIFS 9

4.复制文件的内容生成一个修改的文件,然后替换其中的一个字符,以及用新的文件名命名

1#!/bin/bash 2 3for((i=1;i<=12;i++)); 4do 5 #创建文件 6 # expr 后面的是计算式 7 ireal=$(expr $i \* 8 + 1); 8 stri=$(expr $i + 1); 9 strireal="$ireal"; 10 echo $stri; 11 s1="startvoice"; 12 s3=".bat"; 13 filename=$s1$stri$s3; 14 cp ./startvoice1.bat $filename; 15 16 #找到匹配字符串并修改,要用到windows下,所以修改行尾符号 17 sed -i "s/roomIdx=1/roomIdx=$strireal/g" $filename 18 unix2dos $filename; 19done 20

https://blog.csdn.net/xxxxxx91116/article/details/7478117

上一篇:shell数组
下一篇:Shell函数

代码交流 2021