-
Notifications
You must be signed in to change notification settings - Fork 20
ShellLearn
目录 start
目录 end|2020-11-05 16:05|
shellcheck
Shell语法检测
切换shell
chsh -s /bin/bash
- sh
- 大多Linux都支持的shell类别
- bash
- zsh
- 高扩展性 配置oh my zsh
- dash
- 它主要是为了执行脚本而出现,而不是交互,它速度更快,但功能相比bash要少很多,语法严格遵守POSIX标准
- 速度确实要快,输入上的交互确实交互不了
- fish
- 交互式的, 补全功能比较好
-
文件头部
#!/bin/sh
表示要使用sh解释器来执行, 可以替换成bash dash- 只要该文件具有执行权限就可以直接运行了
./a.sh
或者绝对路径
- 只要该文件具有执行权限就可以直接运行了
read answer
处理管道的输入也是使用 read
while read line; do
echo $line
done
select
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
break;
done
echo "You have selected $var"
echo printf
比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正则
Pattern | 描述 | |
---|---|---|
${varible#*str} |
截取 首个
|
str 右 的字符串 |
${varible##*str} |
截取 最末
|
str 右 的字符串 |
${varible%%str*} |
截取 首个
|
str 左 的字符串 |
${varible%str*} |
截取 最末
|
str 左 的字符串 |
- ${varible:start:end} 定长截取
- ls -al | cut -d "." -f 2 取常规文件后缀名
获取命令的输出
-
使用 保存结果的变量名=
需要执行的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 … $n"的形式输出所有参数。 |
$$ |
脚本运行的当前进程ID号 |
$! |
后台运行的最后一个进程的ID号 |
$@ |
与$*相同,但是使用时加引号 以"$1" "$2" … "$n" 的形式输出所有参数。 |
$- |
显示Shell使用的当前选项,与set命令功能相同。 |
$? |
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
读取脚本参数
# 1. 简单的方式
case $1 in
-h | h)
echo "help"
;;
*)
echo "default"
;;
esac
# 2. 规范化的参数
while getopts "hup:" opt; do
case "$opt" in
h)
usage
exit 0
;;
u)
UPCASE=true
;;
d)
DATE=$OPTARG
;;
esac
done
判断文件
-
文件
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
for i in $(seq 1 5); do
echo $i
done
for (( a=0; a<10; a++)) do
echo $a;
done
while
i=1
while [ "$i" -le 10 ];do
echo $i
i=$(($i+1))
done
- break continue: break能跳出多层循环,只需带上数字
break num
,也可以理解为无参的break默认带了1参数 - done 后面可以接重定向,将循环的输出转到文件而不是终端
Shell的函数只能返回整型数据类型
- 定义函数
function a {}
a(){}
- 注意:
- Shell是解释执行,必须先定义,然后调用,而且函数没有重载,只覆盖
- 命令行内定义函数:
function hi { echo hi;};
注意左括号和命令的空格,以及命令;结尾
simple(){
echo "simple"
}
zero(){
return 0
}
# 函数退出状态码(0-255)
echo "return "$?
# 使用输出返回值
result=$(simple)
- 引用 shell 文件
source shell文件相对路径
source可以简写为.
# 1
while IFS= read -r -u3 line; do
echo "$line"
done 3< "$2"
# 2
cat a.log | while read line; do
echo "line: "$line;
done
- 当前目录创建临时文件,并输出创建的文件名
mktmp data.XXXXXX
-
-t
在 /tmp/目录下创建,并返回全路径 -
-d
创建目录
- 输出到终端并写入文件
echo "test" | tee a.log
[block]
name=myth
- 如果没有
[block]
这样的声明就可以当sh用, 直接 source file 就加载了配置内容
更为直观, 简单
学习怎么使用的话, 可以看上面的博客(虽然有点简陋), 但是如果是 oh-my-zsh 的用户, 可以直接看别人的插件, 模仿就行了, 例如 redis-cli 插件的自动补全, 就很简单直接
-
#compdef redis-cli rec
这第一行很重要, 定义了是对哪个命令或脚本的自动补全
- 获取命名或函数标准输出 ` 反引号包裹命令 或者 $()
- 检查当前用户为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
- 得到脚本绝对路径; 如果只是执行 pwd 只是得到执行脚本时的当前绝对路径而已
basepath=$(cd \`dirname $0\`; pwd)
-
【 Algorithm 】
-
【 Blog 】
-
【 C 】
-
【 Database 】
-
【 Distributed 】
-
【 FrontEnd 】
- 【 FrontEnd/Frame 】
- 【 FrontEnd/Node 】
- Font
- Hexo
- JavaScript
- LearnPS
- ResponseCode
- SVG
- ViewSolution
- extjs学习笔记
-
【 Functional 】
-
【 Go 】
-
【 Groovy 】
-
【 Java 】
- 【 Java/AdvancedLearning 】
- 【 JavaBasic 】
- 【 JavaCache 】
- 【 JavaCollection 】
- 【 JavaConcurrency 】
- 【 JavaMap 】
- Annotation
- ClassFile
- Collection
- Concurrency
- Deploy
- Exception
- ExtendsAndInterface
- Generics
- IO
- JDBC
- JDKAndJRE
- JMX
- JVM
- Java11
- Java7
- Java8
- JavaNetwork
- JavaReleaseVersion
- JavaWeb
- JvmPerformance
- MQ
- MultipleLanguage
- Proxy
- Reflection
- Serialize
- SyntaxAndType
- Thread
- WebPerformance
- 【 Java/Android 】
- 【 Java/Ecosystem 】
- 【 Java/MSA 】
- 【 Java/Spring 】
- 【 Java/TemplateEngine 】
- 【 Java/Test 】
- 【 Java/Tool 】
- 【 Java/thread 】
- AlibabaJavaStandard
- DesignPattern
- HashMap解析
- Java-NIO
- Java虚拟机
- Log
- MIS
- Quartz
- RESTful
- WebSocket学习笔记
- ZooKeeper学习笔记
- android学习笔记
- 【 Java/AdvancedLearning 】
-
【 Kotlin 】
-
【 Linux 】
- 【 Linux/Alpine 】
- 【 Linux/Arch 】
- 【 Linux/Base 】
- 【 Linux/Centos 】
- 【 Linux/Container 】
- 【 Linux/Debian 】
- 【 Linux/Tool 】
- JavaDevInit
- Linux系统学习
-
【 MyBlog 】
-
【 Python 】
- 【 Python/Tool 】
- Python
- PythonConcurrent
- PythonGUI
- PythonGame
- PythonNet
- PythonOffices
- PythonWeb
- Python基础
- Python核心学习
-
【 Reactive 】
-
【 Rust 】
-
【 Scala 】
-
【 Script 】
-
【 Skills 】
- 【 Skills/Application 】
- 【 Skills/CS 】
- 【 Skills/Cache 】
- 【 Skills/Councurrency 】
- 【 Skills/DevOps 】
- 【 Skills/Document 】
- 【 Skills/Ecology 】
- 【 Skills/Network 】
- 【 Skills/Search 】
- 【 Skills/SoftwareEngineering 】
- 【 Skills/Spider 】
- 【 Skills/Test 】
- 【 Skills/Vcs 】
- 【 Skills/Work 】
- AppManual
- CelebrityQuotes
- Miscellaneous
- Platform
- Problem
- Protobuf
- RegularExpression
- SoftwareDesignEngineer
- Website
-
【 Windows 】