Shell学习笔记
时间:2022-04-27
本文章向大家介绍Shell学习笔记,主要内容包括1. 变量、2. 替换、3. 运算&判断、4. 数组、5. 条件语句、6. 循环、7. 引入文件、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
1. 变量
声明变量
- 以
a-zA-Z
开头,不包含特殊字符 - 等号两边没有空格
- 不与保留字符重名
PATH="/user/yihui"
使用
- 变量前加 $ 符号,表示引用变量, 可以用
{}
进行变量名的圈定 - 支持变量的重新赋值
-
readonly
修饰变量为不可更改 -
unset
删除变量(且无法再次声明和使用,只读变量无法删除)
PATH="/user/yihui"
echo "the path is ${PATH}/tmp"
PATH="/test"
echo "after modify, the new path is ${PATH}/tmp"
readonly PATH
PATH="/new"
// 输出为:
the path is /user/yihui/tmp
after modify, the new path is /test/tmp
./in.sh: line 12: PATH: readonly variable
特殊变量
Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
-
$$
表示当前Shell进程的ID,即pid -
$0
当前的脚本名 -
$#
传递给脚本或函数的参数个数。 -
$n
传递给脚本或函数的参数。n是一个数字,表示第几个参数,例如,第一个参数是$1
,第二个参数是$2
-
$?
上个命令的退出状态,或函数的返回值 -
$*
传递给脚本或函数的所有参数 -
$@
传递给脚本或函数的所有参数, 与$*
区别在于被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"
的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n"
的形式输出所有参数
echo "current pid:$$"
echo "arg num: $#"
echo "shell name: $0"
echo "second arg: $2"
echo "last return $?"
for var in $*:
do
echo "$var"
done
echo "$*=" $*
echo "$*=$*"
for var in $@:
do
echo "$var"
done
echo "$*=" $@
echo "$@=$@"
current pid:36886
arg num: 4
shell name: ./in.sh
second arg: hello
last return 0
test
hello
wolrd
123:
$*= test hello wolrd 123
$*=test hello wolrd 123
test
hello
wolrd
123:
$*= test hello wolrd 123
$@=test hello wolrd 123
2. 替换
命令替换
限制性shell命令,并将结果保存在变量之中
用反引号,将shell命令包含起来即可
Data=`date`
echo "data is $Data"
UNUM=`who | wc -l`
echo "current user num: $UNUM"
data is 2017年 5月21日 星期日 14时54分19秒 CST
current user num: 2
变量替换
上面使用
${varName}
来表示变量,放在双引号中时,会自动被值替换,下面给出一些扩展
- 单引号('')之内的变量不会被替换
-
${var:-word}
如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值 -
${var:=word}
如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word -
${var:?message}
如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。 若此替换出现在Shell脚本中,那么脚本将停止运行 -
${var:+word}
如果变量 var 被定义,那么返回 word,但不改变 var 的值
3. 运算&判断
数学运算
使用 expr xxx
-
expr $a + $b
表示两数相加
数学判断
- -eq 是否相等 相当于 ==
- -ne 是否不等 相当于 !=
- -gt 大于
- -ge 大于等于
- -lt 小于
- -le 小于等于
布尔运算
- ! 取非
- -o 或运算,有一个满足即可
- -a 与运算,两个都满足才对
注意
条件表达式要放在方括号之间,并且要有空格,例如 [$a==$b] 是错误的,必须写成 [ $a == $b ]
#!/bin/sh
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a * $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a is equal to b"
fi
if [ $a != $b ]
then
echo "a is not equal to b"
fi
输出
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a is not equal to b
字符串运算
- = 表示字符串是否相等
- != 表示字符串是否不等
- -Z 检测长度是否为0, 是则为true
- -n 检测长度是否不为0,非0则为true
- str 检测字符串是否为空 , 非空则为true
- 字符串长度
${#varName}
- 字符串切割
${arName:1:4}
a="hello"
b="world"
if [ $a = $b ];then
echo "a equal b"
elif [ $a != $b ];then
echo "a not equal b"
fi
if [ $a ];then
echo "$a is not blank"
fi
if [ -n $a ];then
echo "$a's length bigger then 0"
fi
echo "$a's length ${#a}"
echo "$a index of 1, 4 is ${a:1:4}"
a not equal b
hello is not blank
hello's length bigger then 0
hello's length 5
hello index of 1, 4 is ello
4. 数组
声明
ary=(value1 value2 value3)
读取
第0个元素: ${ary[0]}
所有元素: $ary[*]
$ary[@]
长度 : ${#ary[*]}
ary=('hello' 'world' 'java' 'shell')
echo $ary
echo ${ary[1]}
echo "all cell is : ${ary[*]}"
echo "length ${#ary[*]}"
hello
world
all cell is : hello world java shell
length 4
5. 条件语句
if语句
语法:
if [ condition ]; then
xxx
elif [ condition ]; then
xxx
else
xxx
fi
switch语句
语法:
case value in:
v1)
xxx
xxx
;;
v2)
xxx
xxx
;;
*)
xxx
;;;
esac
测试
ary=('hello' 'world' 'java' 'shell')
if [ ${ary[0]} = 'helo' ];then
echo "first cell is helo"
elif [ ${ary[0]} = 'hello' ];then
echo "first cell is hello"
else
echo "default"
fi
read option
case $option in
${ary[0]}):
echo "print hello"
;;
${ary[1]}):
echo "print world"
;;
${ary[2]}):
echo "print java"
;;
${ary[3]}):
echo "print shell"
;;
*):
echo "print other"
;;
esac
输出
first cell is hello
java <-- 这个是自己输入的
print java
6. 循环
for循环
语法
for 变量 in 列表:
do
xxx
done
for ((i=0;i<$#;i++)):
do
xxx
done
ary=('hello' 'world' 'java' 'shell')
for i in ${ary[*]}
do
echo $i
done
for ((i=0;i<10;i++))
do
printf "%d %s" $i ' '
done
输出
hello
world
java
shell
0 1 2 3 4 5 6 7 8 9
while循环
语法
while condition
do
xxx
done
COUNTER=0
while [ $COUNTER -lt 5 ]
do
COUNTER='expr $COUNTER+1'
echo $COUNTER
done
until循环
循环执行,直到条件为true时停止,语法同while
ary=('hello' 'world' 'java' 'shell')
i=0
until [ ${ary[$i]} = 'world' ]
do
i=`expr $i + 1`
echo $i
done
1
break, continue
循环的控制
7. 引入文件
前面加一个点号, 引入文件,则可以直接访问文件中的变量
. fileName
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Matlab矩阵加入新元素
- 每个Python程序员都应该知道的10个缩写
- 《剑指offer》第九天:斐波那契数列
- [tensorflow损失函数系列]sigmoid_cross_entropy_with_logits
- 0794-5.16.2-Hive和Imapla查询decimal类型结果不同异常
- 利用TFRecords存储于读取带标签的图片
- matlab sum函数
- [tensorflow损失函数系列]softmax_cross_entropy_with_logits
- RESTful API 设计最佳实践
- Spring 是如何解决循环依赖的?
- 移动webhead参数
- 看了这篇泛型,下次设计链表别傻傻的用int 表示node节点的值了
- 标准TensorFlow格式 TFRecords
- LeetCode 05最长回文子串
- 基于NCNN的3x3可分离卷积再思考盒子滤波