-
Notifications
You must be signed in to change notification settings - Fork 10
ShellLearn
mythos edited this page Jul 21, 2018
·
7 revisions
目录 start
目录 end |2018-07-17| 码云 | CSDN | OSChina
首先语法不像别的语言可读性好,比如Python,然后方言众多,学习比Python2,3还恶心
Shell 编程之语法基础 | Shell 编程之执行过程
Shell 教程
- sh
- 大多Linux都支持的shell类别
- bash
- zsh
- 十分现代化 配置oh my zsh
- dash
- 它主要是为了执行脚本而出现,而不是交互,它速度更快,但功能相比bash要少很多,语法严格遵守POSIX标准
- 速度确实要快,输入上的交互确实交互不了
- fish
常用代码片段
- 获取当前shell脚本的绝对路径
basepath=$(cd `dirname $0`; pwd) - 命令嵌套 只要在 命令中用 两个反引号 `` 将子命令包住即可
- 检查当前用户为Root用户
if [ $(id -u) != "0" ]; then
printf $red"Please use root to run this script\n"$end
exit 1
fi- kill 脚本进程
id=`ps -ef | grep "WithRedis.py" | grep -v "grep" | grep -v "\-d" | awk '{print $2}'`
if [ "${id}1" = "1" ];then
printf $red"not exist background running script\n"$end
else
kill -9 $id
fi-
文件头部
#!/bin/sh表示要使用sh解释器来执行, 可以替换成bash dash- 只要该文件具有执行权限就可以直接运行了
./a.sh或者绝对路径
- 只要该文件具有执行权限就可以直接运行了
read answer
echo printf
red='\033[0;31m'
green='\033[0;32m'
yellow='\033[0;33m'
blue='\033[0;34m'
purple='\033[0;35m'
cyan='\033[0;36m'
white='\033[0;37m'
default='\033[0m'比Python的作用域更加恶心
# 实现了读取 A_host变量的值
perfix='A_'
name=${perfix}host
host=${!name}${command}-
echo ${command}|awk '{run=$0;system(run)}'最好
- 自增:
- i=$(( $i + 1 )) dash sh 都有效
- ((a++))
i=`expr $i + 1`;- let i+=1;
- i=$[$i+1];
- 取余
- i=$(( $i % 3))
- 四则运算 参考博客
- ((i=$j+$k)) 等价于 i=
expr $j + $k - ((i=$j-$k)) 等价于 i=
expr $j -$k - ((i=$j*$k)) 等价于 i=
expr $j \*$k - ((i=$j/$k)) 等价于 i=
expr $j /$k
- ((i=$j+$k)) 等价于 i=
判断变量是否为数值
if [ "$1" -gt 0 ] 2>/dev/null ;then
echo "$1 is number."
else
echo 'no.'
fi - 字符串截取 | Blog:变量字符串截取 | Shell正则
${varible##*string} 从左向右截取最后一个string后的字符串
${varible#*string} 从左向右截取第一个string后的字符串
${varible%%string*} 从右向左截取最后一个string后的字符串
${varible%string*} 从右向左截取第一个string后的字符串
vars=${vars%%#*} # 截取#左边
vars=${vars#*cd} # 截取最左的cd的右边
vars=${vars%\'*} # 截取 右边引号 之左获取命令的输出
-
使用 保存结果的变量名=
需要执行的linux命令这种方式来获取命令的输出时,注意的情况总结如下: -
1)保证反单引号内的命令执行时成功的,也就是所命令执行后$?的输出必须是0,否则获取不到命令的输出
-
2)即便是命令的返回值是0,也需要保证结果是通过标准输出来输出的,而不是标准错误输出,否则需要重定向
-
因此我们推荐使用 保存结果的变量名=
需要执行的linux命令 2>&1的方式来获取命令的执行结果。 -
输出变量时:
$var会丢失换行和空格"$var"不会
字符串的包含问题
isGithub=`expr match "$line" ".*"$2`
# 简单的就是使用grep
isGithub=`echo $line | grep "github" `
# return 0 is $1 is substring of $2, otherwise 1
strIsSubstring(){
local x=1
case "$2" in
*$1*) x=0;;
esac
echo $x
}求长 ${#var}
字符串拆分成数组
- 如果是空格分割的字符串
- 直接
for element in $target
- 直接
参考博客
命令行选项 参数处理
- 只是 $1 $2 ....
- 脚本退出运行
exit 0
- 脚本退出运行
- 得到脚本绝对路径; 如果只是执行 pwd 只是得到执行脚本时的当前绝对路径而已
basepath=$(cd \`dirname $0\`; pwd) 判断文件
-
文件
if [ -f path ] -
链接
if [ -L path ] -
目录
if [ -d path ] -
整数比较
-
-eq等于,如:if [ "$a" -eq "$b" ] -
-ne不等于,如:if [ "$a" -ne "$b" ] -
-gt大于,如:if [ "$a" -gt "$b" ] -
-ge大于等于,如:if [ "$a" -ge "$b" ] -
-lt小于,如:if [ "$a" -lt "$b" ] -
-le小于等于,如:if [ "$a" -le "$b" ] -
大于(需要双括号),如:(("$a" > "$b")) -
>=大于等于(需要双括号),如:(("$a" >= "$b"))
-
case $content in
-h|h)
echo "help"
;;
*)
echo "前面全部不匹配才会执行"
;;
esac简易循环
for j in $(seq 1 5); do
echo $j
done i=1
while [ "$i" -le 10 ];do
echo $i
i=$(($i+1))
doneShell的函数只能返回整型数据类型
simple(){
echo "simple"
}- Introduction
- ApiAndDoc
- Platform
- Process
- Repository
- SUMMARY
- Website
- 【 Article 】
- 【 Blog 】
- 【 Database 】
- 【 FrontEnd 】
- 【 FrontEnd/Frame 】
- 【 FrontEnd/Node 】
- Hexo
- JavaScript
- LearnPS
- ResponseCode
- ViewSolution
- 【 Functional 】
- 【 Go 】
- 【 Java 】
- 【 Java/AdvancedLearning 】
- 【 Java/Framework 】
- 【 Java/MSA 】
- 【 Java/Spring 】
- 【 Java/TemplateEngine 】
- 【 Java/Tool 】
- AlibabaJavaStandard
- EE
- JavaSE
- Log
- MIS
- RESTful
- ZenOfPattern
- 【 Linux 】
- 【 Linux/Alpine 】
- 【 Linux/Arch 】
- 【 Linux/Base 】
- 【 Linux/Centos 】
- 【 Linux/Container 】
- 【 Linux/Debian 】
- 【 Linux/Tool 】
- 【 Linux/Vcs 】
- JavaDevInit
- 【 MyBlog 】
- 【 MyBlog/Problem 】
- 2018-3-15-install-deepin
- why-put-netty-in-tomcat
- 【 Python 】
- 【 Reactive 】
- 【 Script 】
- 【 Skills 】
- 【 Skills/CS 】
- 【 Skills/Document 】
- 【 Skills/Ecology 】
- 【 Skills/FrameWork 】
- 【 Skills/Soft 】
- 【 Skills/Spider 】
- 【 Skills/Test 】
- 【 Skills/Work 】
- AppManual
- CelebrityQuotes
- CodingThinking
- Problem
- RegularExpression
- SoftwareDesignEngineer
- 【 Windows 】