bash 学习笔记

一直在用bash,但是却只是一知半解,这篇是学习Bash 脚本教程的学习笔记,算是查漏补缺。

基本语法

command [ arg1 ... [ argN ]]

比如ls -i ls是命令,-l是参数。

type

type命令可以显示一个命令是不是内置命令:

bash-3.2$ type npm
npm is /Users/versions/node/v14.16.1/bin/npm

变量

export

用户创建的变量仅可用于当前 Shell,子 Shell 默认读取不到父 Shell 定义的变量。为了把变量传递给子 Shell,需要使用export命令。这样输出的变量,对于子 Shell 来说就是环境变量。

export Foo=foo
bar=bar
node
> process.env.Foo
'foo'
> process.env.bar
// 读不到

字符串处理

  • 获得字符串长度:
a="1234455"
echo ${#a}
  • 获取子字符串,语法为${varname:offset:length}

str="hello"
echo ${str:2} # llo

算术表达式

两个小括号里面可以计算算数表达式

a=2
b=4
(($a + $b))
echo $(($a + $b))
  • 进制转换
echo $((0xff)) # 16进制
echo $((2#1011101)) # 二进制
echo 4((077)) # 八进制

算数表达式也可以用到条件判断里面:

a=3
if (($a > 2)) 
then
 echo 'yes'
fi

条件判断

语法:

if commands; then
  commands
elif commands; then
  commands...]
else
  commands]
fi

注意: 中括号中引用变量名要用双引号引起来

  • 字符串比较
string1=string2;

if [ "$string1" = "string2" ]
then
echo "== $string1"
fi
  • 数字比较
if ((3 > 2)); then
  echo "true"
fi
  • 正则比较
INT=-5

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
  echo "INT is an integer."
  exit 0
else
  echo "INT is not an integer." >&2
  exit 1
fi

循环

for i in {1..4}
do
  echo $i
done

其中{1..4}表示一个连续的序列,这个要和[1-4]区分开,这个是在匹配,如正则表达式中用到的

ls hello[1-4].txt

再比如批量修改图片大小:

for file in `ls LS*.jpg`
convert $file -resize 3000x2000 "${file}_2.jpg"

函数

定义一个函数很简单:

fn(){

}

调用的时候可以传参fn foo,在函数体内可以引用这些参数:

$1~$9:函数的第一个到第9个的参数。
\(0:函数所在的脚本名。 \)#:函数的参数总数。
下面是一个例子;如果直接调用hello,会要求输入名字再打印,如果传入参数hello name,则直接打印。

hello() {
  if (($# > 0))
  then
    echo "Hello $1";
  else
    echo "what's your name";
    read name;
    echo "Hello $name"
  fi
}

在函数中,可以使用return 返回一个结果,并在下面的代码里面通过$?读取返回值。

function func_return_value {
  return 10
}

执行上面的函数,然后通过$?获得返回值

$ func_return_value
$ echo "Value returned by function is: $?"
Value returned by function is: 10

此外,$?也可以用来判断某一行脚本是否正确执行:
比如我们想知道 npm install 是否成功

npm install

if ["$?" = "0"]
then
  echo 'success';
else
  echo 'error';
posted @ 2022-03-26 16:38  饭特稠  阅读(34)  评论(0编辑  收藏  举报