Skip to content
On this page

Bash实用方法

通过文件路径提取文件名称/所在目录

使用dirname获取文件所在目录

TIP

该方法不仅可以提取文件所在的目录,还能提取目录所在的目录

使用方法:

shell
dirname NAME

示例:

shell
str="/a1/b1/c1/foo.png"
# 输出 /a1/b1/c1
echo $(dirname $str)

str1="/a1/b1/c1"
# 输出 /a1/b1
echo $(dirname $str1)

使用basename获取文件名称

使用方法:

shell
basename NAME [SUFFIX]

示例:

shell
str="/a1/b1/c1/foo.png"
# 输出 foo
echo $(basename $str .png)
# 输出 foo.png
echo $(basename $str)

使用${str##*x}截取字符串

  • x是字符串中的任意字符

TIP

${str##*.}Bash shell脚本中的参数替换(Parameter Substitution)语法,表示从字符串$str中删除最后一个.及其前面的所有内容,即删除$str中的文件名部分,只留下扩展名。例如,如果$str的值是image.jpg${str##*.}的结果将是jpg

这个语法中,##符号表示从字符串开头删除匹配的最长内容,*.表示任意字符(*)后面跟着一个.

shell
str="./a/dsa/fwe/s.pkg"
# 输出 s.pkg
echo ${str##*/}
# 输出 pkg
echo ${str##*.}

使用${str%.*}截取字符串

TIP

${str%.*}是一个Bash shell脚本中的参数替换(Parameter Substitution)语法,表示删除字符串$str最后一个.及其后面的所有内容,即删除$str文件名中的文件扩展名。例如,如果$str的值是image.jpg${str%.*}的结果将是image

这个语法中,%符号表示从字符串末尾删除匹配的最短内容,.*表示字符(.)后面跟着零个或多个字符

如果不知道该文件的后缀,但是想获取该文件的名称

shell
str="./a/dsa/fwe/s.pkg"
echo $(basename ${str} .${str##*.})

判断变量是否包含某个字符串

使用grep

示例:

shell
str="/a1/b1/c1/foo.png"
res=$(echo $str | grep "foo")
if [ "$res" != "" ]
then
  echo "包含foo"
else
  echo "不包含foo"
fi

使用字符串运算符

  • 利用字符串运算符=~直接判断str中是否包含foo
shell
str="/a1/b1/c1/foo.png"
if [[ "$res" =~ "foo" ]]
then
  echo "包含foo"
else
  echo "不包含foo"
fi

xargs

TIP

xargs命令是将前一个命令的输出结果作为参数传递给后一个命令。

例如:

shell
# 在这个例子中,find命令的输出结果(即".jpg"文件列表)会被传递给xargs命令。
find . -name "*.jpg" | xargs rm -f

检测某个目录是否是git仓库

shell
isGit=$(Git rev-parse --Git-dir 2> /dev/null)
echo ${isGit}

获取命令行参数

使用getopts方法

shell
while getopts ":t:p:" opt
do
  case $opt in
    t)
      echo "t为$OPTARG"
      ;;
    p)
      echo "p为$OPTARG"
      ;;
    ?)
      echo "未知参数"
      ;;
  esac
done
# ./test.sh -t debug -p ./app/asd
# 输出 参数t的值为debug 参数p的值为./app/asd
# ./test.sh -a 
# 输出未知参数

获取当前时间

TIP

date 后面有一个空格,否则无法识别命令

  • Y显示4位年份,例如2023
  • y显示2位年份,例如23
  • M表示分钟
  • m表示数字月份
  • D表示当前日期,例如01/05/23,也就是23年1月5号
  • d表示
  • H表示小时
  • h表示英文月份,例如Jan
  • S表示当前秒钟,单位为
  • s表示当前秒钟,单位为毫秒

示例:

shell
time=$(date "+%Y-%m-%d %H:%M:%S")
day=$(date "+%D")
echo ${time}
echo ${day}
# 打印
# 2023-01-05 16:08:29
# 01/05/23

使用read和用户交互

  • read命令可以用作与用户的交互中,需要用户去输入一些信息
shell
read [options] [设置需要获取的变量名]
options含义
-p提示信息,在等待read输入时的提示信息
-t等待用户输入的秒数: read命令会一直等待用户输入,超过这个时间自动走到下一条命令
-n当用户输入的字符等于n指定的数字时,就自动进入下一条命令
-s隐藏数据,一般在需要输入密码时使用

重定向输入和输出

将输入/输出内容重定向到/dev/null文件中

例如:获取当前登录的npm用户,如果没有获取到,就登录

shell
loginName=$(npm whoami 2>/dev/null)
if [ -z ${loginName} ]
then
    echo "请先登录"
    npm login
fi
  • 如果当前命令行未登录npm账号,会报如下错误,如果已登录,则会返回当前登录的npm账号名称
  • 我们在上面将错误输出重定向到了/dev/null文件中,这样如果未登录就避免报错,而是得到了空字符串
shell
npm ERR! code ENEEDAUTH
npm ERR! need auth This command requires you to be logged in.
npm ERR! need auth You need to authorize this machine using `npm adduser`

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/xxx/.npm/_logs/2023-03-10T15_19_28_286Z-debug-0.log

获取当前机器IP

shell
ifconfig | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}'