Shell 基础知识

发布于 2024-11-04 18:23:47 字数 8898 浏览 3 评论 0

配置相关

避免 删除 复制 移动 命令的误操作

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

source global definitions

if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

设置环境变量

  • PATH=$PATH:/path/to/bin : 控制台中设置,不赞成这种方式,因为他只对当前的 shell 起作用,换一个 shell 设置就无效了
  • 修改 /etc/profile 文件 export PATH="$PATH:/NEW_PATH" 如果你的计算机仅仅作为开发使用时推存使用这种方法,因为所有用户的 shell 都有权使用这个环境变量,可能会给系统带来安全性问题。这里是针对所有的用户的,所有的 shell
  • 修改 ~/.bashrc 文件 export PATH="$PATH:/NEW_PATH" :可以把使用这些环境变量的权限控制到用户级别,这里是针对某一特定的用户,如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的 .bashrc 文件就可以了

修改主机名

  • centos7 or ubuntu: hostnamectl status 查看主机名相关命令, sudo hostnamectl --static set-hostname <host-name> 永久修改主机名,不需要重启,注销重新登录就能看到主机名变化了

链接

ln -s src dest : 在 dest 建立 src 的软连接,src 文件丢失会影响 dest 文件
ln src dest : 在 dest 建立 src 的硬链接,src 和 dest 的各项属性相同

shell 脚本的特殊参数

符号含义
$0shell 脚本名称
$1第一个参数
$ n第 n 个参数
$#脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程 ID 号
$!后台运行的最后一个进程的 ID 号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数
$?显示最后命令的退出状态。0 表示没有错误,其他任何值表明有错误

if

shell 编程中使用到得 if 语句内常用的判断参数(如果是否的话,在下面的语句前面增加 ! 就行了, 注意空格 )

  • -eq 等于
  • -ne 不等于
  • -gt 大于
  • -lt 小于
  • -le 小于等于
  • -ge 大于等于
  • -z 空串: if [[ -z "$test" ]]
  • = 两个字符相等
  • != 两个字符不等
  • -n 非空串
  • -e 判断文件是否存在 if [ -e filename ]
  • -d 判断文件件是否存在 if [ -d foldername ]

下面是 if elif else fi 的语法

if [ "$A" = "GS" ]; then
  echo "yes"
elif [ "$A" = "UC" ]; then
  echo "no"
else
  echo  "your are wrong"
fi

如果 if 中要有判断条件

# || &&
if [ "$option" = "Y" ] || [ "$option" = "y" ]; then
    echo "Entered $option"
fi

case

case 值 in
模式 1)
    command1
    command2
    command3
    ;;
模式 2)
    command1
    command2
    command3
    ;;
*)
    command1
    command2
    command3
    ;;
esac
  • case 后为取值,值后为关键字 in ,接下来是匹配的各种模式,每一模式最后必须以右括号结束
  • 其中模式支持正则表达式,正则的字符对应如下:
字符代表的意义
*任意字串
?任意字元
[abc]a, b, 或 c 三字元其中之一
[a-n]从 a 到 n 的任一字元
|多重选择

变量替换

linux bash shell 之变量替换语法: :- - := = :? ? :+ + =?句法,详见 Parameter Expansion

  • ${parameter:-word} : Use Default Values . If parameter is unset or null, the expansion of word shall be substituted; otherwise, the value of parameter shall be substituted.(这里使用 substituted 是因为最后是对表达式的求值)
  • ${parameter:=word} : Assign Default Values . If parameter is unset or null, the expansion of word shall be assigned to parameter. In all cases, the final value of parameter shall be substituted. Only variables, not positional parameters or special parameters, can be assigned in this way.
  • ${parameter:?[word]} : Indicate(提示) Error if Null or Unset . If parameter is unset or null, the expansion of word (or a message indicating it is unset if word is omitted) shall be written to standard error and the shell exits with a non-zero exit status. Otherwise, the value of parameter shall be substituted. An interactive shell need not exit.
  • ${parameter:+word} : Use Alternative Value . If parameter is unset or null, null shall be substituted; otherwise, the expansion of word shall be substituted.
 parameterparameterparameter
 Set and Not NullSet But NullUnset
${parameter:-word}substitute parametersubstitute wordsubstitute word
${parameter-word}substitute parametersubstitute nullsubstitute word
${parameter:=word}substitute parameterassign wordassign word
${parameter=word}substitute parametersubstitute nullassign word
${parameter:?word}substitute parametererror, exiterror, exit
${parameter?word}substitute parametersubstitute nullerror, exit
${parameter:+word}substitute wordsubstitute nullsubstitute null
${parameter+word}substitute wordsubstitute wordsubstitute null

In all cases shown with "substitute", the expression is replaced with the value shown. In all cases shown with "assign", parameter is assigned that value, which also replaces the expression.

函数

# 没有参数的函数
demoFun() {
    echo "这是我的第一个 shell 函数!"
}
# 调用使用 `demoFun`

# 有返回值 和 cli 交互的 函数
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
# 调用使用 funWithParam
# 1
# 2
# return 3

# 有参数的函数
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

端口相关

  • 查看机器全部开放端口
# 查看全部开放端口
nmap <ip>
# 查看某个端口的状态
nmap <ip> -p <port>

操作符相关

shell 中的 && || [] {} ()

  • && : command1 && command2 && 左边的命令(命令 1)返回真(即返回 0,成功被执行)后,&&右边的命令(命令 2)才能够被执行;换句话说,"如果这个命令执行成功&&那么执行这个命令",其语法格式如下 command1 && command2 && command3 ...
  • || : command1 && command2 || 则与&&相反。如果||左边的命令(command1)未执行成功,那么就执行||右边的命令(command2);或者换句话说,"如果这个命令执行失败了||那么就执行这个命令"
  • () : (command1;command2;command3....) 如果希望把几个命令合在一起作为 整体 执行,shell 提供了两种方法。既可以在当前 shell 也可以在子 shell 中执行一组命令。一条命令需要独占一个物理行,如果需要将多条命令放在同一行,命令之间使用命令分隔符 ; 分隔。执行的效果等同于多个独立的命令单独执行的效果。eg: ls dir &> /dev/null || (cd /home; ls -lh; echo "success")
  • {} : { command1;command2;command3… } 命令将在子 shell 而不是当前 shell 中作为一个整体被执行,只有在{}中所有命令的输出作为一个整体被重定向时

获取命令行参数

How do I parse command line arguments in Bash

# 最简单的方式
while getopts "h?vf:" opt; do
    case "$opt" in
    h|\?)
        show_help
        exit 0
        ;;
    v)  verbose=1
        ;;
    f)  output_file=$OPTARG
        ;;
    esac
done

# 可以自定义的获取数量方式
case $key in
    -e|--extension)
    EXTENSION="$2"
    shift # past argument
    shift # past value
    ;;
    -s|--searchpath)
    SEARCHPATH="$2"
    shift # past argument
    shift # past value
    ;;
    -l|--lib)
    LIBPATH="$2"
    shift # past argument
    shift # past value
    ;;
    --default)
    DEFAULT=YES
    shift # past argument
    ;;
    *)    # unknown option
    POSITIONAL+=("$1") # save it in an array for later
    shift # past argument
    ;;
esac
done

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

像你

暂无简介

0 文章
0 评论
325 人气
更多

推荐作者

玍銹的英雄夢

文章 0 评论 0

我不会写诗

文章 0 评论 0

十六岁半

文章 0 评论 0

浸婚纱

文章 0 评论 0

qq_kJ6XkX

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文