一说到命令行,我们真正指的是 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:
1
2 1cd `dirname $0`
2
含义为:用于取得脚本文件.sh 所在目录,然后将当前目录切换过去
ps:
1 | 1` ```` ` |
反引号 等同于$() , 用于命令替换
命令替换是指 shell 可以先执行命令,将输出结果暂时保存,在适当的地方输出
下面例子用的 $() 进行命令替换
1
2
3
4
5
6
7 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:
1
2
3 1cd `dirname $0`
2python test.py $1 $2 $3
3
3).$#
参数个数,从$1开始算,不算$0
4)上级目录$(dirname "$PWD")
比如:
$(dirname "$PWD")/tmp/文件名
tmp 这个文件夹一定要存在,如果不存在,就会说没有此目录。文件名可以不存在的。
2.比较操作符
用于比较数值大小以及字符串大小,有的比较操作符只能用 单词简写,有的比较操作符也可以用 对应的符号 来标识。注意区分数值大小 和 字符串大小的 是否相等是如何比较的。
[]中写判断条件
(())
" "
$
1)整数比较
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 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
2
3
4 1= 等于,如:if [ "$a" = "$b" ]
2== 等于,如:if [ "$a" == "$b" ],与=等价
3!= 不等于,如:if [ "$a" != "$b" ]
4
3)前面加x
1
2
3
4
5
6 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=
1
2
3 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 | 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条命令执行完(不管是否成功)才执行
1
2
3
4 1if [ 条件判断语句 ];then
2else
3fi
4
8.判断条件
语法:
1
2
3
4 1if [ 条件判断语句 ];then
2else
3fi
4
具体例子
1
2
3
4
5
6
7 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:
- \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行为命令
查看当前的行为命令:比如 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.处理文件名中的空格,可以正常显示带空格文件名
一般输入指令的时候,带空格文件名都要用 ' ' 括起来。
1
2
3
4
5
6
7
8 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.批量去除文件名中的空格
1
2
3
4
5
6
7
8
9
10
11 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.读取文本中每一行(行中带有空格也行)
1
2
3
4
5
6
7
8
9 1SAVEIFS=$IFS
2IFS=$(echo -en "\n\b")
3lines=$(cat 文件名)
4for line in $lines
5do
6 echo $line$
7done
8IFS=$SAVEIFS
9
4.复制文件的内容生成一个修改的文件,然后替换其中的一个字符,以及用新的文件名命名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 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