Bash-Script的复习与梳理

最近把Linux Bash编程的知识复习了一遍,大概梳理了一下,做个记录。

第一个Bash-Script

LINUX shell的种类非常之多,但是目前用得最为广泛的还是Bash,本文也是基于Bash的Shell环境。
下面是一个简单的示例:

#! /bin/sh

echo 'hello world!'

这就是一个最简单的shell脚本了。
第一行的#!用来告诉系统,这个脚本用什么解释器来执行(说明:sh和bash本身是不同的Shell,但是在我目前用得CentOS7版本sh和bash是等价的,sh是一个指向bash的符号链接)。
echo命令输出文本到屏幕

如何运行脚本

一种方式就是将脚本作为解释器的参数,如:

sh test.sh

第二种方式就是授予文件可执行权限

chmod +x test.sh
或者
chmod 755 test.sh

执行脚本
./test.sh
变量与参数
变量

Bash是一种弱类型的语言,你只需要直接定义变量名=value即可。当需要引用这个变量的时候使用$var_name或者${var_name}即可。
$var_name${var_name}的一种简写形式,但是在某些情况下只能使用${var_name},例如:

# 当需要连接两个变量
your_id=${USER}-on-${HOSTNAME}

# 或者会与其他字符串写在一起的时候
echo '${num}instance running!'

所以建议在写shell的时候统一使用${var_name}的风格。
bash中变量是弱类型的,那么不管你传给他的是字符串、数字或者数组他都统统会接收,有时候这就会导致一些问题,比如你想做个计算器,这时候传给了变量一个’ABCDEFG’,那么这时候我们就想这个变量只能接收数字。又或者你想定义一个常量,不想用户修改。那么以上这些我们可以使用declare来声明变量的一些属性。
declare常用参数如下:

-r 定义一个只读变量,也可以使用"readonly var_name"将变量定义为只读变量
-i 定义变量类型为整型
-a 定义变量类型为数组
-f 定义一个函数
-x 定义一个全局变量

当想删除一个变量的时候直接使用unset var_name即可,注意这个命令不能删除只读变量。

参数

那么如何向一个脚本传递参数呢?
当我们想向一个脚本传递参数的时候,直接在执行脚本的命令后面跟参数即可:

sh ./test.sh parm1 parm2 parm3

在脚本中使用$n(n是一个数字,如:$1获取第一个参数)来接收传入的参数即可。下面是可能经常用到的参数变量:

$0 当前脚本的文件名。
$n 传递给脚本或函数的参数。n是一个数字。例如,第一个参数是 $1 。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
@ 传 递 给 脚 本 或 函 数 的 所 有 参 数 。 被 双 引 号 ( " " ) 包 含 时 与 @ 传递给脚本或函数的所有参数。被双引号 (" ")包含时与 @("")*不同。
$? 上个命令的退出状态,或函数的返回值。
$_ 上一个命令的最后一个参数

我们经常用到的Linux命令中有一种叫option的东西,基本模式-optionname或者--longoptionname。如果在我们编写脚本的时候需要option的话,简单的脚本直接把他当普通参数手工处理即可,面对比较复杂的可以使用getopt或者getopt
这里感觉有必要提一下set这个命令,我觉得很牛逼、很厉害、很有用但是我从来没在脚本中使用过的命令。
set命令用来改变内部脚本的变量或者选项。一种应用就是来改变options来影响脚本的行为。另一种应用就是利用set `commond`的输出来重置位置参数。

Example
#!/bin/bash

echo "Command-line argument #1 = $1"
echo "Command-line argument #2 = $2"
echo "Command-line argument #3 = $3"


echo "--------------------------------------"
echo "利用`uname -a`的输出来重置位置参数"
set `uname -a`

echo "Field #1 of 'uname -a' = $1"
echo "Field #2 of 'uname -a' = $2"
echo "Field #3 of 'uname -a' = $3"

exit 0



output:
[root@localhost study]# sh test_set.sh one two three
Command-line argument #1 = one
Command-line argument #2 = two
Command-line argument #3 = three
--------------------------------------
Sets the positional parameters to the output of the commond `uname -a`
Field #1 of 'uname -a' = Linux
Field #2 of 'uname -a' = localhost.localdomain
Field #3 of 'uname -a' = 3.10.0-514.el7.x86_64
数组

目前只支持一维数组!!!!!!!!!!
可以通过以下两种方式来为数组赋值:

#!/bin/bash

my_array=(A B C "D")

my_array[4]=F
my_array[5]="G"

通过${my_array[idx]}来读取数组中的值,也可以通过${my_array[*]}${my_array[@]}来一次性读取数组中的所有元素。通过${#my_array[*]}${#my_array[@]}来获取数组长度。

#!/bin/bash

my_array=(A B C "D")

my_array[4]=F
my_array[5]="G123"

echo "第一个元素:${my_array[0]}"
echo "通过*来获取数组所有元素:${my_array[*]}"
echo "通过@来获取数组所有元素:${my_array[@]}"
echo 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值