shell
shell是一个命令解释器,实际是一个程序,/bin/bash,linux中所有的命令都由它来解释,有自己的语法
shell脚本
以.sh结尾
shell语法+linux命令
注释:
单行注释 :
#
多行注释 :
:<<c c
shell执行方式
bash /path/to/script-name 或 /bin/bash /path/to/script-name (强烈推荐使用)
/path/to/script-name 或 ./script-name (当前路径下执行脚本)
source script-name 或 . script-name (注意“.“点号后面有空格)
前两种执行时,都会开启新的进程执行脚本
source不会开启新的进程
使用source时,可以与当前终端共享进程,共享变量(重点)
变量
1、name=itcast
2、name=‘itcast
$age‘ 不会解析里面的遍历
3、name=”itcast
$age“ 解析变量后,再拼接成新的字符串
命令变量
1、name=`ls`
2、name=$(ls)
括号里必须是linux命令,把命令执行的结果记录给变量
全局变量
方法一:
变量名=值
export 变量
方法二:(最常用)
export 变量名=值
如果是在终端中定义全局变量,作用范围是当前终端及子进程
如果想要自己定义的全局变量在跟系统的全局变量一样在所有环境都有效,需要在~/.bashrc或/etc/profile文件中定义:
修改~/.bashrc后,直接打开新的终端,定义的全局变量就生效了,此方式只对当前用户有效
修改/etc/profile时,需要重启操作系统,定义的全局变量才生效,此方式对所有用户有效
上面两种方式在修改文件后,如果想让全局变量在当前终端生效,需要执行命令source ~/.bashrc或source /etc/profile
查看变量
标准使用方式:"${变量名}"
内置
$0 获取当前执行的shell脚本文件名
$$ 获取执行shell脚本的进程号
$n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10}
$# 获取当前shell命令行中参数的总个数
$? 获取执行上一个指令的返回值(0为成功,非0为失败)
$?:上一条命令是执行一个文件,返回的结果是文件中的最后一条命令
默认值
1、
变量a如果有内容,那么就输出a的变量值
? 变量a如果没有内容,那么就输出默认的内容
? 格式:
???? ${变量名:-默认值}
2、
无论变量a是否有内容,都输出默认值
? 格式:
????${变量名+默认值}
测试语句
等号左右必须有空格,中括号左右必须有空格
test a = 1
[ a = 1 ]
逻辑表达式
&&符号
命令1
&& 命令2
如果命令1执行成功,那么执行命令2
如果命令1执行失败,那么不执行命令2
||符号
命令1 || 命令2
1 如果命令1执行成功,那么不执行命令2
2 如果命令1执行失败,那么执行命令2
文件表达式
判断是否是可执行文件
[ -f abc ] && [ -x abc
]
计算表达式
a=$((a+1))
let a=a+1
重定向
命令>文件
命令返回的结果又正确和错误两种,1代表正确,2代表错误
bash chongdingxiang.sh
>/dev/null 2>&1 &
把正确的和错误的结果都输出到黑洞文件,而且命令在后台执行
linux四剑客
grep
grep -nr 关键字 .
find
find . -name
"*sh"
sed
行编辑工具
-i 真正的修改
s:替换
a:追加
i:插入
d:删除
sed -i "s#sed#SED#g"
sed.txt
每一行找到sed,把所有的替换为SED
sed -i
"2s#SED#sed#2" sed.txt
第二行的第二个SED替换为sed
sed -i "1,4a\hello2"
sed.txt
在1到4行的每一行后追加一行内容
sed -i "1i\hello3"
sed.txt
在第1行前插入一行
sed -i "2d" sed.txt
删除第2行
awk
分析工具,按行处理
awk
‘BEGIN{FS=":";OFS="--"} {print $2,$NF}‘ awk2.txt
默认按照空格或tab键拆分数据,通过OFS指定输出时的分隔符
流程控制
if语句
if [ 条件
]
then
指令1
elif [ 条件2
]
then
指令2
else
指令3
fi
#!/bin/bash read -p "请输入性别:" sex if [ "$sex" == "nan" ] then echo "输入的是男" fi
case语句
#!/bin/bash case "$1" in "start") echo "启动" ;; "stop") echo "停止" ;; "restart") echo "重启" ;; *) echo "。。。。" ;; esac
for循环
遍历文件夹
#!/bin/bash mkdir ../bak for file in $(ls) do # echo "file: $file" cp "$file" ../bak/"${file}-bak" done
seq命令
#!/bin/bash for num in $(seq 5) do echo "num: $num" done
while循环
#!/bin/bash count=1 while [ $count -lt 5 ] do echo "count: $count" let count=count+1 done
until循环
#!/bin/bash count=1 until [ $count -ge 5 ] do echo "count: $count" let count=count+1 done
函数
#!/bin/bash echo "jiaoben : $1,$2,$3" dayin(){ if [ $# = 3 ] then echo "hanshu : $1,$2,$3" else echo "需要3个参数" fi } #dayin e f g dayin $1 $2 $3
使用source执行脚本,脚本中定义的变量和函数都能在当前终端调用
让root用户能够使用python虚拟环境
export
WORKON_HOME=/home/python/.virtualenvs/
source /usr/local/bin/virtualenvwrapper.sh
原文地址:https://www.cnblogs.com/longguoliang/p/9477414.html