https://www.cnblogs.com/jingmoxukong/p/7867397.html详情
1.echo代表输出
echo "Hello World!"
输出带变量的字符串
echo "hello,\"bn\""
an=apple
echo "hello, \"${an}\""
换行
echo "Yes\nNo"
#这里"\n"是不会起换行作用的,因为没有转义
echo -e "Yes\nNo"
#-eb表示开启转义,这时才会换行
开启转义不换行
echo -e "Yes\c"
echo "No"
输出重定向至文件
echo "test" > test.txt
输出执行结果
echo 'pwd'
#输出当前路径目录
2.变量
a="apple"
echo $a
echo ${a}
只读变量,一旦变量被readonly定义,则变量的值不变,如下,去掉#则会执行错误
a="apple"
readonly a
#a="pear"
echo $a
删除变量(unset不能删除只读变量)
a="apple"
echo $a
unset a
echo $a
#输出为空
Variablesbash环境变量列表
- 单引号的特点
- 单引号里不识别变量
- 单引号里不能出现单独的单引号(使用转义符也不行),但可成对出现,作为字符串拼接使用。
- 双引号的特点
- 双引号里识别变量
- 双引号里可以出现转义字符
单双引号的区别
1.在双引号中,变量引用或者命令置换是会被展开的。在单引号中是不会的。
echo "Your home: $HOME" ### Your home: /Users/<username>
echo 'Your home: $HOME' ### Your home: $HOME
2.当局部变量和环境变量包含空格时,它们在引号中的扩展要格外注意
INPUT="A string with strange whitespace."
echo $INPUT ### A string with strange whitespace.
echo "$INPUT" ### A string with strange whitespace.
(如果输入 可能 包含空格,务必要用引号把表达式包起来)
单引号拼接
a="apple"
echo "hello,"${a}""
双引号拼接同理,将单引号改为双引号即可
获取字符串长度(获取数组长度同理,只需将变量改为数组${#nums[*]})
a="apple"
echo ${#a}
提取字符串
a="apple"
echo ${a:2:2}
查找子字符串
a="apple"
echo `expr index "${a}" pp`
创建数组
nums=([0]=0,[1]=1,[2]=2)
fruits=(apple pear "banana grape")
输出数组指定元素
echo ${nums[0]}
输出数组全部元素
echo ${fruits[*]}
echo ${fruits[@]}
每个元素单独一行输出
printf "+ %s\n" ${fruits[*]}
""捆绑时每个元素单独一行输出
printf "+ %s\n" "${fruits[@]}"
输出数组部分元素
echo ${nums[@]:0:2}
(可以解释为,nums数组从第0个开始输出2个元素)
添加数组元素
fruits=(orange "${fruits[@]}" watermelon)
echo ${fruits[@]}
删除数组某一元素
unset nums[0]
echo ${nums[*]}
运算符
x=10
y=20
val=`expr $[x] + $[y]`
echo "$[x] + $[y] = $val"
val=`expr ${x} - ${y}`
echo "${x} - ${y} = $val"
val=`expr ${x} \* ${y}`
echo "${x} * ${y} = $val"
val=`expr ${y} / ${x}`
echo "${y} / ${x} = $val"
val=`expr ${y} % ${x}`
echo "${y} % ${x} = $val"
if [[ ${x} == ${y} ]]
then
echo "${x} = ${y}"
fi
if [[ ${x} != ${y} ]]
then
echo "${x} != ${y}"
fi
关系运算符
if [[ ${x} -eq ${y} ]]; then
echo "${x} -eq ${y} : x 等于 y"
else
echo "${x} -eq ${y}: x 不等于 y"
fi
if [[ ${x} -ne ${y} ]]; then
echo "${x} -ne ${y}: x 不等于 y"
else
echo "${x} -ne ${y}: x 等于 y"
fi
if [[ ${x} -gt ${y} ]]; then
echo "${x} -gt ${y}: x 大于 y"
else
echo "${x} -gt ${y}: x 不大于 y"
fi
if [[ ${x} -lt ${y} ]]; then
echo "${x} -lt ${y}: x 小于 y"
else
echo "${x} -lt ${y}: x 不小于 y"
fi
if [[ ${x} -ge ${y} ]]; then
echo "${x} -ge ${y}: x 大于或等于 y"
else
echo "${x} -ge ${y}: x 小于 y"
fi
if [[ ${x} -le ${y} ]]; then
echo "${x} -le ${y}: x 小于或等于 y"
else
echo "${x} -le ${y}: x 大于 y"
fi

布尔运算符

逻辑运算符
&&表并且,||表或者
字符串运算符
-z
检查字符串长度是否为零,为零返回true,而-n不为零返回true
if [[ -z ${x} ]];then
echo "-z ${x} : 字符串长度为 0"
else
echo "-z ${x} : 字符串长度不为 0"
fi
str检查字符串是否为空
if [[ ${x} ]];then
echo "${x} : 字符串不为空"
else
echo "${x} : 字符串为空"
fi
文件测试运算符

file="/etc/hosts"
if [[ -r ${file} ]]; then
echo "${file} 文件可读"
else
echo "${file} 文件不可读"
fi
if语句
if [[ 1 -eq 1 ]]; then echo "1 -eq 1 result is: true"; fi
#单行写可以,不过要加;
if [[ 1 -eq 1 ]]; then
echo "1 -eq 1 result is: true"
fi
#fi表示结束
if [[ 2 -ne 1 ]]; then
echo "true"
else
echo "false"
fi
#if-else语句,学过C语言的都知道
x=10
y=20
if [[ ${x} > ${y} ]]; then
echo "${x} > ${y}"
elif [[ ${x} < ${y} ]]; then
echo "${x} < ${y}"
else
echo "${x} = ${y}"
fi
#if elif else语句
case 语句,适用于面对多种情况要有不同的措施
exec
case ${oper} in
"+")
val=`expr ${x} + ${y}`
echo "${x} + ${y} = ${val}"
;;
"-")
val=`expr ${x} - ${y}`
echo "${x} - ${y} = ${val}"
;;
"*")
val=`expr ${x} \* ${y}`
echo "${x} * ${y} = ${val}"
;;
"/")
val=`expr ${x} / ${y}`
echo "${x} / ${y} = ${val}"
;;
*)
echo "Unknown oper!"
;;
esac
for循环
for arg in elem1 elem2 ... elemN
do
### 语句
done
for i in {1..5}; do echo $i; done
#横着写一行
for (( i = 0; i < 10; i++ )); do
echo $i
done
DIR=/home/zp
for FILE in ${DIR}/*.sh; do
mv "$FILE" "${DIR}/scripts"
done
# 将 /home/zp 目录下所有 sh 文件拷贝到 /home/zp/scripts
拓展一下bash里的大括号扩展
Bash扩展(一)大括号扩展和波浪线扩展 - ninja_ken - 博客园
while循环(跟for循环一样,如果我们把do和被检测的条件写到一行,那么必须要在do之前加一个分号。)
### 0到9之间每个数的平方
x=0
while [[ ${x} -lt 10 ]]; do
echo $((x * x))
x=$((x + 1))
done
# Output:
# 0
# 1
# 4
# 9
# 16
# 25
# 36
# 49
# 64
# 81
until循环
until循环跟while循环正好相反。它跟while一样也需要检测一个测试条件,但不同的是,只要该条件为 假 就一直执行循环
select循环
#!/usr/bin/env bash
PS3="Choose the package manager: "
select ITEM in bower npm gem pip
do
echo -n "Enter the package name: " && read PACKAGE
case ${ITEM} in
bower) bower install ${PACKAGE} ;;
npm) npm install ${PACKAGE} ;;
gem) gem install ${PACKAGE} ;;
pip) pip install ${PACKAGE} ;;
esac
break # 避免无限循环
done
#先询问用户他想使用什么包管理器。接着,又询问了想安装什么包,最后执行安装操作。
#$ ./my_script
#1) bower
#2) npm
#3) gem
#4) pip
#Choose the package manager: 2
#Enter the package name: gitbook-cli
break和continue
break语句用来提前结束当前循环。
continue语句用来跳过某次迭代。(通常在fi上行)
# 打印10以内的奇数
for (( i = 0; i < 10; i ++ )); do
if [[ $((i % 2)) -eq 0 ]]; then
continue;
fi
echo ${i}
done
# Output:
# 1
# 3
# 5
# 7
# 9
bash函数定义
function my_function() {
# 函数体
echo "这是一个函数"
}
my_function() {
# 函数体
echo "这是一个函数"
}
#函数可以接受参数
#!/bin/bash
function greet() {
echo "Hello, $1!"
}
greet "World"
another_greet() {
echo "Hi there, $1!"
}
another_greet "Basher"
#输出
#Hello, World!
#Hi there, Basher!
说明:
- 函数定义时,
function关键字可有可无。 - 函数返回值 - return 返回函数返回值,返回值类型只能为整数(0-255)。如果不加 return 语句,shell 默认将以最后一条命令的运行结果,作为函数返回值。
- 函数返回值在调用该函数后通过
$?来获得。 - 所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至 shell 解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
#!/usr/bin/env bash
calc(){
PS3="choose the oper: "
select oper in + - \* / # 生成操作符选择菜单
do
echo -n "enter first num: " && read x # 读取输入参数
echo -n "enter second num: " && read y # 读取输入参数
exec
case ${oper} in
"+")
return $((${x} + ${y}))
;;
"-")
return $((${x} - ${y}))
;;
"*")
return $((${x} * ${y}))
;;
"/")
return $((${x} / ${y}))
;;
*)
echo "${oper} is not support!"
return 0
;;
esac
break
done
}
calc
echo "the result is: $?" # $? 获取 calc 函数返回值
位置参数
$0是脚本本身的名字
shift命令用于将所有的位置参数向左移动,$1的值被丢弃,$2变成$1,$3变成$2,等等
#!/bin/bash
echo "Your first argument is $1"
shift
echo "Your first argument is now $1"
#Your first argument is arg1
#shift
#Your first argument is now arg2
$@和$*都可以获取所有的位置参数,不同的是,$@和$*在被双引号(")包围时处理方式不同
$#可以获取传递给脚本的位置参数的个数
#!/bin/bash
echo "There are $# arguments"
#There are 3 arguments
$!后台运行的最后一个进程的 ID 号
$-返回使用的当前选项
$?函数返回值
命令置换
``和$()都可以,但二者有区别:$()方式的能力更强,它支持嵌套语法,而反引号``方式不支持命令替换的嵌套
算术扩展
算数表达式必须包在$(( ))中
result=$(( ((10 + 5*3) - 7) / 2 ))
echo $result ### 9
在算数表达式中,使用变量无需带上$前缀。
3745

被折叠的 条评论
为什么被折叠?



