看自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系统门户网站

ln命令_Linux ln命令:创建文件链接

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命令

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的区别

linux根目录空间为什么会满-CSDN论坛

若挂载点/满了,可主要删除bcloud和glide的一些编译文件

12.bc工具,shell 显示百分数

shell 显示百分数_chengxuyonghu_51CTO博客

13.cp命令前的反斜杠

linux中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

Linux中解析json---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

Linux xargs 命令 | 菜鸟教程

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

SHELL脚本定期删除日志文件(日志定期清理) - 知乎

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

Linux cd命令_L, there!-CSDN博客

60.shell正则:

https://man.linuxde.net/docs/shell_regex.html

61.设置环境变量:

linux 设置go环境变量 - 简书

62.mac下将换行替换为逗号

在Mac上的sed中用字符串替换换行符 - DebugCN

63.kill(kill -15)和kill -9的区别

Kill之中-9和-15的区别 - Timzhouyes的博客 | Timzhouyes's Blog

IBM Docs

64.linux设置系统环境变量的文件

Linux&Mac系统环境变量配置 | SherlockGy's Blog

65.shell中的&作用:

shell 中 && 和 & 的区别 | Yisen的博客

66.匹配正则:

正则不要跟-w 一起使用;

grep与正则表达式 - 简书

#匹配txt文件
ll | egrep "\.txt$"      #这里的"."需要进行转义

67.lsof -i:命令结果受当前用户的影响

68.

Logo

更多推荐