shell-笔记
看自shell菜鸟教程:https://www.runoob.com/linux/linux-shell-variable.html另外文档可参考:http://www.zsythink.net/archives/category/%e5%bc%80%e5%8f%91/bash/jp参看链接:https://blog.csdn.net/yanbingquan/article/details...
看自shell菜鸟教程:Shell 变量 | 菜鸟教程
另外文档可参考:http://www.zsythink.net/archives/category/%e5%bc%80%e5%8f%91/bash/
jp参看链接:shell jq解析_明天是Spring的博客-CSDN博客_jq shell
命令行 JSON 处理工具 jq 的使用介绍_Linux编程_Linux公社-Linux系统门户网站
1.for循环
for file in `ls /etc`; do echo $file; done
等价于:
for file in $(ls /etc);do echo $file ;done
2.if条件语句:
注意:条件与符号[]之间要有空格,并且目录名要写绝对路径;
错误:
if [ ! -d "~/shell-icode/" ];
then
mkdir ~/shell-icode
else
echo "file dir already exist"
fi
3.cat <<EOF命令
正确:
if [ ! -d "/Users/xxx/shell-icode/" ];
then
mkdir /Users/xxx/shell-icode
else
echo "file dir already exist"
fi
3.使用变量时才加$
4.变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
echo "I am good at ${skill}Script"
注意:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
5.多行注释
可以将一段代码定义成函数;或者利用:
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
注意:EOF可以为任意字符;
6.实践:写脚本拉取git代码,并执行项目中的单测,mvn命令
#!/bin/bash
function git_pull_master()
{
cd /xx/xx/xx/xx/xx
git clone ssh://xxxxxxxxxx
cd xx/xx/xx
}
if [ ! -d "/xx/xx/xx/xx/xx/" ];
then
mkdir /xx/xx/xx/xx/xx
else
echo "xx-xx-xx dir already exist"
fi
if [ ! -d "/xx/xx/xx/xx/xx/xx/xx/xx/" ];
then
git_pull_master
else
cd /xx/xx/xx/xx/xx/xx/xx/xx
git pull
fi
export MAVEN_HOME=/usr/local/maven3
export PATH=${PATH}:${MAVEN_HOME}/bin
export JAVA_HOME=/usr/local/jdk1.8.0_191
export JRE_HOME=/usr/local/jdk1.8.0_191/jre
export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
mvn test
若脚本中,没有给出环境变量;crontab -e设置定时任务时,报没有mvn命令;
7.shell数组
#!/bin/bash
array_name=(
value0
value1
value2
value3
)
length=${#array_name[@]}
echo "获取数组的长度:$length"
echo "获取数组的每个元素:${array_name[@]}"
echo "获取数组的每个元素:${array_name[*]}"
echo "获取数组的第一个元素:${array_name[0]}"
echo "获取数组的第一个元素的长度:${#array_name[0]}"
结果:
获取数组的长度:4
获取数组的每个元素:value0 value1 value2 value3
获取数组的每个元素:value0 value1 value2 value3
获取数组的第一个元素:value0
获取数组的第一个元素的长度:6
8.条件表达式和运算符同表达式之间要有空格
if [ $a == $b ]
then
echo "a等于b"
else
echo "a不等于b"
fi
9.算数
a=5
b=6
result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"
result2=`expr $a + $b`
echo "result22为:$result2"
10.jq解析json串
10.shell脚本调试
set -e:通知bash若某条语句执行结果不为true,则退出脚本;
set +e:忽略错误继续执行;错误的标准是echo $?后值为非0的情况;所以要想继续执行下面的命令,需要在执行错误的命令前面加上set +e,之后再加上set -e即可;
set -x:日志输出;
exit 0:代表当前shell 正确退出;
exit 非0:代表当前shell 错误退出;
11.df -hl查看磁盘使用情况
Linux du命令和df命令区别_wisgood的专栏-CSDN博客_df和du的区别
若挂载点/满了,可主要删除bcloud和glide的一些编译文件
12.bc工具,shell 显示百分数
shell 显示百分数_chengxuyonghu_51CTO博客
13.cp命令前的反斜杠
shell脚本中,见如:
\cp -r ${变量A}/* ${变量B}/
14.dirname $0
dirname $0,获取当前Shell脚本的路径
15.let的使用
16.realpath的使用
17.目录软连接
ln -s 有数据的目录 目的目录/ #会在目的目录中生成有数据的最后那个字段目录
18.grep
为什么ps -ef | grep registry-data | grep -vc grep输出不是非包含grep的具体行呐,而是数值1?是因为-c 参数的作用;
grep命令搜索到关键字就会把相关数据行提取出;
grep是行提取命令,cut是列提取命令;
19.字符截取命令
注意:printf不支持数据流操作;即:cat file.txt | printf #会报错;
20.统计某目录及其子目录下的文件有多少个?
find . -type f -name "*.c" | wc -l
21.awk命令
Linux awk 只处理第一个匹配的行与只处理指定行_hongweigg的专栏-CSDN博客_awk只匹配一次
a=$(echo ${变量名} | sed 's/,/\n/g' | grep '字符串' | awk -F '分隔符' 'NR==行号{print $列号}')
22.shell获取星期几
date +%w
23.sed的使用
sed -i 's/"${变量名}" test/"${变量名}" test --key=\/home\/目录名/' 文件名.sh #sed -i 's/要被替换的内容/将要替换成为的内容/' 文件名.sh
24.ln软连接:
25.shell脚本中变量的使用:
code_path=xxx/xxx/xxx
function funcname()
{
src_dir=${code_path}/a
echo ${src_dir}
}
funcname
26.shell调用Python:
shell脚本中调用python脚本的函数并获取python脚本函数的return值_SAGGITARXM-CSDN博客_shell脚本调用python脚本
valueing=`python -c 'import py文件; print py文件.py文件中的类().类中方法(参数)'`
27.shell发get请求(加参数):
abc=`curl -H "Content-type:application/json" "http://df/fd/fd/fd/fd?b=${ss}&a=${ss}"`
28.shell字符串转json:
Linux Shell格式化Json_一个程序员的成长之路。。。-CSDN博客_shell 格式化json
abc='{"a":"b","b":"c"}'
echo ${abc} | jq .
如何解析json:
shell解析json字符串_程序手艺人 - 有趣有能量-CSDN博客_shell解析json字符串
29.安装jq
make失败时,看readme,执行即可
Linux中在命令行中使用JQ来解析修改JSON字符串:Linux中在命令行中使用JQ来解析修改JSON字符串 - 简书
获取值( -r 参数是去掉双引号):shell解析json之jq工具_victoria_hong的博客-CSDN博客_json解析工具jq
30.shell执行命令:(问题)
- 问题:
excmd='wget -O output.tar.gz --no-check-certificate --header "xxx:xxx" "https://xxxx/xx"'
$("${excmd}")为什么不行;
报:
- 笨办法解决方案:
将excmd内容重定向到一个文件sh中,然后再执行:
echo ${excmd} >excmd.sh
sh -x excmd.sh
31.默认cache-dir/bin/中的内容(包含文件夹和文件)会覆盖a-output/output/bin中的内容
cp -r cache-dir/bin/ a-output/output/bin 等价与cache-dir/bin/ a-output/output/bin/
cp -r cache-dir/bin/* a-output/output/bin/ # 其中cache-dir/bin/*不能含有子文件夹,只能含有文件
32.sed 命令:
替换某字符串:sed: 1: “…”: invalid command code - 落格博客
shell脚本替换json文件中部分字段_Hdnrnfgf的专栏-CSDN博客_shell修改json的值
无比强大的shell之json解析工具jq , Linux命令行解析json, jq解析 json 实例:Shell:无比强大的shell之json解析工具jq , Linux命令行解析json, jq解析 json 实例
dfg=127.0.0.1:8888/public/c:123
sed -i "s#abc=.*#abc=$dfg#g" 文件名.sh
33.shell利用Python处理json串:
shell处理json字符串_gj19890923的专栏-CSDN博客_shell解析json字符串
str='{
"old": {
"a11": "1",
"a12": "2",
"a13": "3"
},
"other": {
"b11": "1",
"b12": "2"
}
}'
py_code="
import sys,json
input=sys.stdin.read()
str=input.replace(' ','')
dict=json.loads(str)
dict_old=dict.get('old',{})
dict_other=dict.get('other',{})
dict_old.update(dict_other)
print(json.dumps(dict_old))
"
main(){
value=$(echo ${str}|python -c "${py_code}")
echo "get value:${value}"
}
main
34.搜索某文件,并都cp到某目录下:
find 查找的目录/ -name "*.log"|xargs -I {} cp {} abc/
xargs与cp结合使用 - starspace - 博客园
35.find -L 命令的使用
Linux find 命令详解 - HuYuanBlog - 博客园
只拷贝文件不拷贝软连接下目标文件的父目录的内容:可以用cp 来实现;反之,用cp --parent 来实现;
36.xargs 命令的使用;
输出查找文件的属性:find 查找的目录/ -name "*.log"|xargs ls -ahtl
统计xx.log文件的个数:find 查找的目录/ -name "*.log"|xargs ls -ahtl | wc -l
删除查找目录下xxx.log文件:find 查找的目录/ -name "*.log"|xargs rm -f
展示最新的10个xxx.log文件:find ./ -name "*.log"|xargs ls -ahtl | head -10
37.export的用法
a=10 && export a 的效力仅限于该次登陆操作。即,同一个账号进行第二次登录时,第二次的命令终端中进行echo $a结果为空;
38.bashrc文件:
请注意后两个的区别:’.bash_profile’只在会话开始时被读取一次,而’.bashrc’则每次打开新的终端时,都要被读取。
39.export和bashrc结合使用:
可实现全局变量的设定;
40.bashrc、/etc/profile、/etc/bashrc、/etc /profile.d的区别
用户目录下的.bashrc文件:属于用户级设置,只是限制在用户应用上;每次打开控制台或终端窗口时,都会生效;
“/etc/profile”文件、“/etc/bashrc”文件及目录“/etc /profile.d”下的文件:应用到整个系统,属于系统级的配置;
bashrc与profile的区别_frank的专栏-CSDN博客_bashrc和profile区别
41.查看端口对应的进程和进程号:
42.查看某进程对应的端口号:
43.获取某目录的软连接的目标目录:
readlink -f ./目录名
44.cp和cp --parent的区别?
拷贝某目录下的所有内容(包含文件和软连接、目录),cp -r 目录/ 目标目录/
45.查找多个文件:
即查找.txt和.log文件:
find ./ -name "*.txt" -o -name "*.log"
46.获取目录的上上级目录:
Linux shell获得当前目录、上级目录、目录的最后部分 - 简书
47.shell中浮点数运算
$ CC=$(echo "2.1+5" | bc)
$ echo $CC
48.截取域名后缀:
a=mp.csdn.net.com
a=${a%.net.com}
输出:mp.csdn
49.crontab的使用
crontab -e
50.将小数末尾的0去掉:
如何用shell将浮点数 2.195000 后的没有用的零去掉?-CSDN论坛
Shell printf格式字符串_荣耀之路-CSDN博客_shell打印字符串
哦,兄弟,我想得到结果是把 2.195000 的后面的0去掉,变成 2.195
也就是说保持数的结果是不变的,只是把后面多余的三个0去掉,这样如何实现?
那也容易 用printf格式化即可
var=2.195000
printf "%g" $var
这就是你要的结果 如果要把结果赋值给新的变量 则
newvar=$(printf "%g" $var)
51.查看当前目录占用空间大小:
du -ah --max-depth=1
du -sh : 查看当前目录总共占的容量。而不单独列出各子项占用的容量
du -lh --max-depth=1 : 查看当前目录下一级子文件和子目录占用的磁盘容量。这几个之和就是du -sh的结果
52.shell if小数比较:
shell if 小数 比较 _Tenderrain_51CTO博客
53.获取进程pid
linux shell 根据进程名获取pid_星河的博客-CSDN博客_linux 获取pid
只输出pid,且kill掉:kill -9 $(lsof -i:port -t)
Linux lsof 命令 - sparkdev - 博客园
awk的应用:
1.打印第一列:
awk -F':' '{ print $1 }' /etc/passwd
注意:awk必须是单引号;跟列相关的是 -F参数
同命令:
cut -d':' -f1 /etc/passwd
2.打印第1列和第7列,并用制表符分隔:
awk -F':' '{print $1 "\t" $7}' /etc/passwd
3.在输出的头加name 和shell列,输出结尾加blue和/bin/bash列:
awk -F':' 'BEGIN{print "name\tshell"}{print $1 "\t" $7}END{print "blue\t/bin/bash"}' /etc/passwd
注意:awk用函数BEGIN和方法print;
4.搜索/etc/passwd中有关键字root的行:
注意:跟行相关的,就不需要-F参数了,每行的内容用$0
awk '/root/ {print $0}' /etc/passwd
5.输出每行行号,每列列号,对应的完整行内容:
注意:行号对应NR,列号对应NF,完成行内容对应$0
awk -F':' '{print NR "\t" NF "\t" $0}' /etc/passwd
若不加-F':' ,默认是按空格和制表符来分隔;
6.统计报表,合计每人01月份的工资:
awk.txt文件:
Tom 0 2012-12-11 car 3000
John 1 2013-01-13 bike 1000
vivi 1 2013-01-18 car 2800
Tom 0 2013-01-20 car 2500
John 1 2013-01-28 bike 3500
awk '{split($3,date,"-");if (date[2]=="01"){name[$1]+=$5}}END{for(i in name){print i "\t" name[i]}}' awk.txt
vivi 2800
Tom 2500
John 4500
sed命令:
1.文件查找和压缩:
根据文件大小来查询:
2.
54.while多个条件时:
变量名1=0
变量名2=3
cp home/work/helloworld.sh home/work/helloworld-cp.sh
while ( [ $? -ne 0 ] && [ "${变量名1}" -le "${变量名2}" ] )
55.删除除某目录之外的其他目录:
Shouldn't "ls -l * | xargs rm -rf" work?
cd /目录绝对路径
ls -l | grep -v "目录名1" | grep -v "目录名2" | grep -v "目录名3" | awk '{print $9}' | xargs rm -rf
等价于:
cd /目录绝对路径
rm -rf !(目录名1|目录名2|目录名3)
56.shell 脚本判断磁盘大小百分比是否超过设定值
shell 脚本判断磁盘大小百分比是否超过设定值_1892962964_新浪博客
查询所有磁盘的可用百分比:df -k | grep -v Filesystem| awk '{print int($5)}'
57.shell单双引号拼接:
a='"dfdfd"'
echo ‘wget xxxx "dfdfdfdf" ’$a >log.txt
58.rsync -av 源 目的
第2章 rsync(一):基本命令和用法 - 骏马金龙 - 博客园
59.cd -P
60.shell正则:
https://man.linuxde.net/docs/shell_regex.html
61.设置环境变量:
62.mac下将换行替换为逗号
63.kill(kill -15)和kill -9的区别
Kill之中-9和-15的区别 - Timzhouyes的博客 | Timzhouyes's Blog
64.linux设置系统环境变量的文件
Linux&Mac系统环境变量配置 | SherlockGy's Blog
65.shell中的&作用:
66.匹配正则:
正则不要跟-w 一起使用;
#匹配txt文件
ll | egrep "\.txt$" #这里的"."需要进行转义
67.lsof -i:命令结果受当前用户的影响
68.
更多推荐
所有评论(0)