shell 相关的基础知识
变量
var=value
var="value ${var}"
var='$var'
- 定义变量时=两边不能有空格,
- 单引号表示是字符串,其中的变量不会进行解释,
- 双引号,字符串中的变量会用它的值进行替换
echo printf
- echo 打印输出字符串
- printf 格式化打印输出字符串,与c语言的printf()比较类似
{} 扩展
mv /usr/bin/file{,.bak}
{1..50} # 可以扩展为1到50
{a..z} # a b c .. z
将/usr/bin下的file文件生命名为file.bak,通过 { } 可以不用多敲一遍路径
字符串长度
${#var}
如果存在变量var则给出字符串长度,否则输出0
shell 类型
$0 or $SHELL
查看环境变量
env
$UID 用户ID,root用户ID为0
$PS1 命令行提示符
$PATH 环境变量
$HOME 家目录
$PWD 当前目录
$USER 当前用户
$? 上一个命令执行后的退出状态,0 ->成功执行
算术运算
let (()) []
expr bc
#!/bin/bash
# mathdemo.sh
no1=34
no2=20
let result=no1+no2
echo $result
res=$[ no1 - no2 ]
ans=$((no1+no2))
ans2=$(expr 3 + 4)
echo $res
echo $ans
echo $ans2
echo '4*2.89' | bc
- 使用let时,变量不用加$ 符号
- bc可以进行浮点数运算
文件描述符及重定向
stdin 0
stdout 1
stderr 2
< 定向到标准输入流
> 定向到标准输出流
2> 定向到标准错误流
>> 追加
&> 将stdout 与 stderr 合并并进行重定向
自定义文件描述符
0,1,2是stdin,stdout和stderr的预留描述符。
文件打开模式:
- 只读模式 <
- 截断模式 >
- 追加模式 >>
# 创建一个文件描述符进行读取
exec 3< read.file
# 创建一个文件描述符进行截断写入
exec 4> write.file
# 创建一个文件描述符进行文件的追加
exec 5>> append.file
数组与关联数组
#!/bin/bash
# 数组索引从0开始
array=(1 2 3 4 5)
index=2
echo ${array[0]}
echo ${array[$index]}
#打印出所有数组的值
echo ${array[*]}
echo ${array[@]}
# 打印数组长度
echo ${#array[@]}
关联数组:
declare -A ass_array
ass_array=([index1]=varlue1 [index2]=varlue2)
# 列出数组索引
echo ${!ass_array[*]}
echo ${!ass_array[@]}
stty
# 设置读取密码时不输出到终端
stty -echo
read password
stty echo
echo input passworld success
shell 调试
bash -x script.sh
-x #将脚本中执行过的每一行都输出到stdout
set -x
set +x 禁止调试
set -v
set +v 禁止打印输入
通过选项-x可以启动调试shell脚本
函数
function fname()
{
statements;
}
or
fname()
{
statements;
}
fname #执行函数
fname arg1 arg2 #传递参数
$1 第一个参数
$2 第二个参数
$@ 可以扩展为"$1" "$2" ...
export -f fname #导出函数,函数扩展到子进程
子shell
cmd_output=$(command)
cmd_output=`command`
可以通过子shell读取命令的输出
子shell生成单独进程
(command) #会在一个子进程中执行
out="$(cat file)" #通过引号引用子shell可以保留空格与换行
read
#!/bin/bash
# 不回显地读取数据
read -s var
# 显示提示信息
read -p "prompt: " var
# 在2秒内读取数据
read -t 2 var
# e用定界符结束输入行
read -d ":" var
内部分隔符 IFS
IFS 默认为空白字符