shell 相关的基础知识

来源:互联网 发布:网游网络加速器哪个好 编辑:程序博客网 时间:2024/05/01 05:06

shell 相关的基础知识

变量

var=valuevar="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.shno1=34no2=20let result=no1+no2echo $resultres=$[ no1 - no2 ]ans=$((no1+no2))ans2=$(expr 3 + 4)echo $resecho $ans echo $ans2echo '4*2.89' | bc
  • 使用let时,变量不用加$ 符号
  • bc可以进行浮点数运算

文件描述符及重定向

stdin   0stdout  1stderr  2<       定向到标准输入流>       定向到标准输出流2>      定向到标准错误流 >>      追加&>      将stdoutstderr 合并并进行重定向

自定义文件描述符

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=2echo ${array[0]}echo ${array[$index]}#打印出所有数组的值echo ${array[*]}echo ${array[@]}# 打印数组长度echo ${#array[@]}

关联数组:

declare -A ass_arrayass_array=([index1]=varlue1 [index2]=varlue2)# 列出数组索引echo ${!ass_array[*]}echo ${!ass_array[@]}

stty

# 设置读取密码时不输出到终端stty -echo read passwordstty echoecho input passworld success

shell 调试

bash -x script.sh -x #将脚本中执行过的每一行都输出到stdoutset -xset +x 禁止调试set -vset +v 禁止打印输入 

通过选项-x可以启动调试shell脚本

函数

function fname(){statements;}orfname(){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 默认为空白字符

0 0