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';
cnblogs-md-editor编辑器,用Markdown写博客就用它