Bash:基础

The Bash shell is commonly used interactively: It lets you enter and edit commands, then executes them when you press the Return key.The Bash shell can also be run non-interactively from a script, making the shell require no human interaction.

变量

变量的初始化,Bash shell 在默认情况下不会区分变量类型,即使将整数和小数赋值给变量,它们也会视为字符串。

变量的使用是通过美元符号$来引用的。例如

#!/usr/bin/env bash

author="tom"
echo $author
echo ${author}

# 将命令的结果赋值给变量
variable=$(command)

echo ${variable}

变量名外面的花括号是可选的,可加可不加,加上可以帮助解释器识别变量的边界。建议给所有变量加上花括号。

在 shell 中定义的变量,默认就是全局变量。全局变量的作用范围是当前的 shell 进程,而不是当前 shell 脚本文件。

在 shell 函数中定义的变量默认也是全局变量,如果想要将变量作用域仅限于函数内部,可在定义时加上 local 命令。

全局变量只在当前 Shell 进程中有效,对其它 Shell 进程和子进程都无效。如果使用 export 命令将全局变量导出,那么它就在所有的子进程中也有效了,这称为 环境变量。

通过 export 导出的环境变量只对当前 Shell 进程以及所有的子进程有效,如果最顶层的父进程被关闭了,那么环境变量也就随之消失了,其它的进程也就无法使用了,所以说环境变量也是临时的。

命令替换

shell 命令替换是指将命令的输出结果赋值给某个变量。有两种方式完成命令替换,一是反引号 ` `,二是美元符号加括号 $()。

variable=`commands`
variable=$(commands)

commands 是要执行的命令。commands 可以只有一个命令,也可以有多个命令,多个命令之间以分号 ; 分隔。

$() 仅在 Bash shell 中有效,但支持嵌套。反引号` `可在多种shell中使用,但是不支持嵌套。

参数

通过 $n 的形式来接收参数,称为位置参数。

给脚本文件传递位置参数

echo "Language: $1"
echo "URL: $2"

 给函数传递位置参数

#定义函数
function func(){
    echo "Language: $1"
    echo "URL: $2"
}
#调用函数
func Java https://www.company.com

shell 中有一些特殊变量:

  • $0 当前脚本的文件名
  • $# 传递给脚本或函数的参数个数
  • $* 传递给脚本或函数的所有参数
  • $@ 传递给脚本或函数的所有参数
  • $? 上个命令的退出状态,或者函数的返回值
  • $$ 当前 shell 进程 ID。对于 shell 脚本,就是这些脚本所在的进程 ID
  • $! 最后运行的后台Process的PID

shell 中变量分为位置变量和特殊变量。

数据类型

shell 中基本数据类型有字符串和数字。

字符串可以由单引号包围,也可以由双引号包围,也可以不用引号。

获取字符串长度:${#str}。

字符串拼接:在 shell 中你不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接。

name="Shell"
url="http://c.biancheng.net/shell/"
str1=$name$url  #中间不能有空格
str2="$name $url"  #如果被双引号包围,那么中间可以有空格
str3=$name": "$url  #中间可以出现别的字符串
str4="$name: $url"  #这样写也可以
str5="${name}Script: ${url}index.html"  #这个时候需要给变量名加上大括号

字符串的截取:从左边开始计数 ${string:start:length},从指定字符(子字符串)开始截取 ${string#*chars}

shell 也支持数组,且没有限制数组的大小。shell 是弱类型,并不要求所有数组元素的类型必须相同。利用 @ 或 * 可以获取所有的元素。

arr=(20 56 "hello")
arr[0]=50
echo ${arr[2]}
echo ${arr[*]}

用 unset 关键字来删除数组元素,用法 unset arr[index] 如果不写下标就是删除整个数组 unset arr

通过 # 来获取数组元素的个数 ${#arr[@]} 或者 ${#arr[*]}

数组拼接的写法 array_new=(${arry1[@]} ${arry2[@]})

数学计算

shell 和其他编程语言不同,shell 不能直接进行算数运算,必须使用数学计算命令。shell 中常用的数学计算命令如下:

  • (( )) 用于整数运算,效率很高,推荐使用
  • let 用于整数运算
  • $[ ] 用于整数运算
  • expr 用于整数运算,也可以处理字符串
  • bc 可以处理整数和小数,Linux下的一个计算器程序
  • declare -i 将变量定义为整数,仅支持最基本的数学运算(加减乘除和取余)

 双小括号 (( )) 的语法格式为:((表达式)) 表达式可以只有一个,也可以多个,多个表达式之间以逗号分隔。对于多个表达式,以最后一个表达式的值作为整个 (( )) 命令的执行结果。

可以使用 $ 获取 (( )) 命令的结果,这和使用 $ 获得变量值是类似的。在 (( )) 中使用变量不需要加 $ 前缀,(( )) 会自动解析变量名。

b=10
((a=b+5))
echo ${a}

d=$((b+6))
echo ${d}

 let 命令语法格式为:let 表达式 或者 let "表达式" 或者 let '表达式' 它们都等价于 ((表达式)) 。

选择结构

最常用的 if 语句,语法格式为:

if  condition
then
    statement(s)
fi

 也可以将 if 和 then 写在一行:

if  condition;  then
    statement(s)
fi

 多条件语句:

if  condition1
then
   statement1
elif condition2
then
    statement2
elif condition3
then
    statement3
else
   statementn
fi

退出状态 exit statu 每一条 shell 命令,包括 Bash 内置命令、Linux 命令、自定义 shell 函数,当它退出(运行结束)时,都会返回一个比较小的整数值给调用(使用)它的程序,这个就是命令的退出状态。

很多 Linux 命令其实就是一个 C 语言程序,main() 函数的最后都有一个 return 0,如果程序想在中间退出,还可以使用 exit 0,这其实就是 C 语言的退出状态。当有其他程序调用这个程序时,就可以捕获这个退出状态。

if 语句的判断条件,从本质上讲,判断的就是命令的退出状态。

按照惯例来说,推出状态0 表示成功,其它任何退出状态为失败。但是也有例外,例如 diff 命令。

test 是 shell 内置命令,用来检测某个条件是否成立。test 命令用法为:test expression 也可以简写为 [ expresssion ]。

与文件检测相关的 test 选项:

  • -e filename 判断文件是否存在

与数值比较相关的 test 选项:

  • num1 -eq num2 判断 num1 是否和 num2 相等

与字符串判断相关的 test 选项:

  • -z str 判断字符串 str 是否为空
  • -n str 判断字符串 str 是否为非空

与逻辑运算相关的 test 选项:

  • expression1 -a expression2 逻辑与
  • expression2 -o expression2 逻辑或
  • !expression 逻辑非

双中括号 [[ ]] 是 shell 内置关键字,它和 test 命令类似,也用来检测某个条件是否成立。用法是: [[ expression ]] 可以理解为是 test 的升级版。

较多分支使用 case in 语句:

case expression in
    pattern1)
        statement1
        ;;
    pattern2)
        statement2
        ;;
    pattern3)
        statement3
        ;;
    *)
        statementn
esac

循环结构

while 循环是 Shell 脚本中最简单的一种循环,当条件满足时,while 重复地执行一组语句,当条件不满足时,就退出 while 循环。

while condition
do
    statements
done

Shell 脚本还提供了 for 循环,它更加灵活易用,更加简洁明了。Shell for 循环有两种使用形式。

C 语言风格的 for 循环:

for((exp1; exp2; exp3))
do
    statements
done

Python 风格的 for in 循环:

for variable in value_list
do
    statements
done

注意,select 是无限循环(死循环),输入空值,或者输入的值无效,都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D 组合键才能结束循环。

echo "What is your favourite OS?"
select name in "Linux" "Windows" "Mac OS" "UNIX" "Android"
do
    echo $name
done
echo "You have selected $name"

函数

shell 函数定义的语法结构如下:

function name() {
    statements
    return value
}

return 语句可写可不写。

调用函数直接给出函数名即可:name;如果传递参数,那么多个参数之间以空格分隔:name param1 param2 param3

注意调用函数时不需要带括号。

补充

variable=$(commands)  是指命令替换。

variable=$((a+10)) 是指数学计算。 

[ expression ] 是 test 的简写。

[[ expression ]] 是 test 的升级版。

参考:

http://c.biancheng.net/shell/ 

原文地址:https://www.cnblogs.com/colin220/p/10967316.html