Shell 基础知识
配置相关
避免 删除
复制
移动
命令的误操作
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 脚本的特殊参数
符号 | 含义 |
---|---|
$0 | shell 脚本名称 |
$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.
parameter | parameter | parameter | |
---|---|---|---|
Set and Not Null | Set But Null | Unset | |
${parameter:-word} | substitute parameter | substitute word | substitute word |
${parameter-word} | substitute parameter | substitute null | substitute word |
${parameter:=word} | substitute parameter | assign word | assign word |
${parameter=word} | substitute parameter | substitute null | assign word |
${parameter:?word} | substitute parameter | error, exit | error, exit |
${parameter?word} | substitute parameter | substitute null | error, exit |
${parameter:+word} | substitute word | substitute null | substitute null |
${parameter+word} | substitute word | substitute word | substitute 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论