Shell 基础教程

1、Shell 变量

使用变量

your_name="qinjx"
echo $your_name
echo ${your_name}

重新赋值变量

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

只读变量

readonly myUrl
myUrl="http://www.runoob.com"

删除变量

unset variable_name
2、Shell 字符串

单引号

str='this is a string'

双引号

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1

# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3
输出结果为:
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

获取字符串长度

string="abcd"
echo ${#string} #输出 4

提取子字符串

string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

查找子字符串

# 查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4
3、Shell 数组

定义数组

array_name=(value0 value1 value2 value3)

读取数组

valuen=${array_name[n]}
使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}

获取数组的长度

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
4、Shell 注释

单行注释

# 这是一个注释

多行注释

:<<EOF
注释内容...
注释内容...
注释内容...
EOF
EOF 也可以使用其他符号:
:<<'
注释内容...
注释内容...
注释内容...
'

:<<!
注释内容...
注释内容...
注释内容...
!
5、Shell 传递参数

以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
6、Shell 基本运算符

算术运算符
1

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
   echo "a 等于 b"
fi
if [ $a != $b ]
then
   echo "a 不等于 b"
fi
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

关系运算符
2
布尔运算符
3
逻辑运算符
4

字符串运算符
5

文件测试运算符
6

7、Shell echo命令

显示转义字符

echo "\"It is a test\""

显示换行

echo -e "OK! \n" # -e 开启转义

显示结果定向至文件

echo "It is a test" > myfile
8、Shell 流程控制

if else

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

for 循环

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

while 语句

while condition
do
    command
done

case … esac

#!/bin/sh

site="runoob"

case "$site" in
   "runoob") echo "菜鸟教程" 
   ;;
   "google") echo "Google 搜索" 
   ;;
   "taobao") echo "淘宝网" 
   ;;
esac
9、Shell 函数
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

函数参数

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !
10、其他操作

获取上级目录

 $(dirname $0)

获取上上级目录

 $(dirname  $(dirname $0))

BASH_SOURCE 是 Bash shell 的一个特殊变量,它不是一个全局通用的概念,而是专属于 Bash shell 脚本环境的。在 Bash shell 中,BASH_SOURCE 是一个数组,其第一个元素给出了当前正在执行的脚本文件的绝对路径名

$(dirname $0)${BASH_SOURCE[0]} 都可用于在 shell 脚本中获取当前脚本的目录路径,但是它们之间存在一些关键区别:

  1. $(dirname $0):

    • $0 是一个 shell 变量,它存储着当前执行的脚本名称(通常是相对路径或绝对路径)。
    • dirname 是一个 shell 内置命令,用于从文件路径中提取目录部分。
    • 当在一个脚本中使用 $(dirname $0) 时,它会返回执行脚本的路径(不包括脚本文件名)。

    例子

    # 如果脚本位于 /path/to/script.sh
    script_dir=$(dirname "$0")
    echo $script_dir
    # 输出:/path/to
    
  2. ${BASH_SOURCE[0]}:

    • ${BASH_SOURCE[0]} 是 Bash shell 的一个特殊变量,它提供了脚本本身的源路径(绝对路径)。
    • $0 不同,${BASH_SOURCE[0]} 在脚本被 source(或 .)执行时依然能正确反映源脚本的位置,而 $0 在这种情况下会给出执行上下文的脚本(即 sourcing 的那个脚本)的路径。
    • 对于非直接执行(即通过 bash script.sh)的所有情况,${BASH_SOURCE[0]} 更可靠,因为它始终指向当前解析的脚本文件。

    例子

    # 如果脚本位于 /path/to/script.sh
    script_dir=$(dirname "${BASH_SOURCE[0]}")
    echo $script_dir
    # 输出:/path/to
    

总结来说:

  • 如果仅关心直接执行脚本时的路径,并且不涉及脚本被 source 执行的情况,两者可能返回相同的结果。
  • 在复杂的脚本嵌套调用或脚本被 source 执行的场景下,使用 ${BASH_SOURCE[0]} 更为准确和一致。特别是在 Bash shell 中,如果需要处理脚本被间接调用的情况,应当优先考虑使用 ${BASH_SOURCE[0]}
11、字符串补充

将命令的结果赋值给变量

Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:

variable=`command`
variable=$(command)

第一种方式把命令用反引号 (位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

12、shell命令test

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
test 命令教程

实例

1、执行npm打包

#!/bin/sh
currentpath=$(dirname $0)
cd $currentpath
buildFun(){
    if test -e ./node_modules
    then
        npm run build
    else
        yarn
        npm run build
    fi
}
buildFun
echo "\"创建完成,请使用当前目录下build文件部署下载页\""

2、写一个shell脚本,双击shell文件后自动执行当前文件夹下的指定nodejs文件

创建一个shell脚本文件(例如:run_node_script.sh),并在该文件中编写如下内容:

#!/bin/bash

# 获取当前shell脚本所在的目录
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)

# 指定要执行的Node.js文件路径,这里假设是当前目录下的app.js
NODE_FILE="${SCRIPT_DIR}/app.js"

# 检查Node.js文件是否存在
if [ -f "$NODE_FILE" ]; then
  # 使用node命令执行该文件
  node "$NODE_FILE"
else
  echo "Error: Node.js file '$NODE_FILE' does not exist."
fi

保存此文件后,需要赋予其执行权限:

chmod +x run_node_script.sh

现在,当你双击这个shell脚本时(或者在终端中运行 ./run_node_script.sh),它会尝试执行当前目录下的app.js文件。

注意:此脚本适用于Linux和macOS系统,Windows环境下可能需要对脚本进行调整以适应cmd或PowerShell环境,并且通常不支持双击直接执行shell脚本,可能需要通过其他方式调用(如通过git bash等)。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值