关于bash

1.linux启动过程:
init——》getty(提供标准输入、输出、错误输出)——》/bin/login(验证密码、建立初始环境)
————》启动登录shell——》/bin/bash(寻找系统文件/etc/profile,执行其中的命令)——》在用户目录下查找
.bash_profile,或者.bash_login,再或者.profil)——》用户目下的.bashrc

set -o
可以查看bash的选项使用情况
allexport 所有变量会传给子shell
noclobber 重定向时防止文件被覆盖

. .bash_profile与source .bash_profile都是运行.bash_profile文件

处理命令的顺序:
别名——》关键字(if、function、while、until)——》
函数——》内置命令(pwd)——》可执行程序或脚本(date)
使用type str来查看str是什么

bash提供了三个命令来改变命令执行顺序:
command:忽略别名和函数,只处理内置命令和可执行文件
bultin:只查找内置命令,忽略函数和可执行文件
enable:可以打开enable -n 可以关闭bultin命令,即使有内置命令还是执行用户的程序
enable -n;
function cd {bultin cd; echo $PWD}
如果在大括号中执行cd 就会无限循环,必须显示执行bultin的cd

退出状态
在一个命令或程序结束之后,都会给父进程返回一个退出状态。0~255
0表示成功执行,非零都为失败,127为没有找到命令,
如果是致命信号导致了命令退出就是128加上导致器退出的信号值
$?可以查看上一条命令的返回值

后台执行命令

在命令之后加一个&就会让它在后台执行,shell会马上返回
$!是最近送入后台执行的命令

作业控制
重置该功能:
set -m
set -o monitor
bash -m -i

ctrl-z:可以将回话挂起
jobs显示现在后来运行的作业
jobs -l显示后台作业与其pid号
bg后台执行,fg前台执行 这两个后面都是加%工作号
%%表示最近的进程,
%string 以string开头的进程   %?string 含string的作业名
jobs -r 列出所有正在运行的进程
jobs -s 列出所有挂起的进程
disown %n 将第n个job移出后台

命令行快捷键
history 显示最近执行的命令
history都写在.bash_history中
fc 从最近的历史中选择命令,
fc -l 列出最近的命令
fc -e editor 将命令历史在编辑器中打开
fc -l n-m 列出从n到m的命令
fc -s string 访问以string开头的命令
!! 重新执行上一条命令
!N 重新执行历史列表中第N条命令
!string  重新执行以string 开头的命令
!:N 上一条命令第N个参数
!$ 上条命令的最后一个参数
!^上条命令的第一个参数
!*上条命令的所有参数

重命名
alias一般都写在.bashrc中
alias m=more
unalias m 删除一个别名
/m 临时禁止别名

管理目录栈
pushd 目录 压入栈
popd 到栈里的最后一个目录
dirs 列出栈中的目录

匹配
echo f{oo,aa,umble} 匹配字符集
unset nogolb 或者 set +f 可以禁止匹配
chopt

变量
(1)局部变量
1.name=tommy   可以这样赋值
2.declare name=tommy 或者这样
-f 列出函数名及其定义  -F列出所有函数名
echo $name 引用变量时之前必须加$
$$代表当前的进程号
bash可以进入一个子进程 exit可以退出
declare -r name=tommy 可以设置一个只读变量 ×等号两边不能加空格×
readonly name 也可以将name设置成只读变量
unset name 可以删除name变量
(2)全局变量
export NAME=john
declare -x NAME=john
NAME=john; expport NAME
export -p 显示所有的全局变量;
export -f name-value的形式被视为函数而不是变量
export -n 将已导出的转换为局部变量
子进程重新设置全局变量以后不会影响父进程中的全局变量
使用转义时echo 需要有-e选项
3.变量扩展修改符
${newfruit:-apple}--> newfruit定义了的话就输出newfruit的值 没有就是apple
${newfruit:=apple}--> 效果同上,但是没有定义newfruit,newfruit会被赋值apple
${newfruit:+apple}--> 若设置了newfruti,他会输出apple
${name:?str}--> 若没有设置name,则会输出str
${name:offset:len}--> 若设置了name,就会输出name的子字符串
pathname="/usr/bin/local/bin"
${pathname%/bin*}--->/usr/bin/local  删除最短匹配
${pathname%%/bin*}--> /usr  删除最长匹配
${pathname#/usr}--> /bin/local/bin删除字符串开始时的usr 若开始不是usr,则没有改变
${pathname##*}-->        删除字符串开头的×匹配, 最大删除,所以会全删
${#pathname}14  输出字符串的长度
$0  字符串的长度
$1-9 位置参量1-9
${10} 位置参量10
$# 位置参量的个数
$* 所有的参量值 $@与此相同,但是有双引号时不同
"$*"-->"$1 $2 $3"  "$@"-->"$1" "$2" "$3"
set a b c d e f g h i j k l m    设置位置参量
print $10-->a0
print ${10}-->j
echo \$$#-->$13
eval echo \$$#-->m
set -- 清空所有变量
4.变量引用
name=tjc
echo \$name --> $name
echo '$name\t$name' --> $name\t$name
echo "$name\t$name" --> tjc  tjc
echo name --> tjc
5.命令替换
echo "The hour is `data '+%H'"
name='awk -F: '{print $1}' database'
echo $name --> 显示awk的执行结果
echo 'basename \'pwd\'' --> tjc 使用嵌套替换时需要用反斜杠将嵌套命令的‘括起来
echo "$(cal)" 输出日历
数学扩展
$[2+3] 或者 $((2+3))
5.数组
declare -a name
name=(item1 item2 item3)
echo ${name[0]}-->item1   数组下标从一开始  输出时必须用${}括起来
echo ${name
  • }--> item1 item2 item3
  • 还可以这样定义states=(ME [2]=1 [5]=3) 没有声明的位置就为空
    6.函数
    function function_name(){}
    export -f 函数名 可以让这个函数变成全局的
    7.exec命令
    exec 3<datefile  定义一个文件的输出gd3
    sort <&3         将fd3的内容sort一下
    exec 4>newfile   定义一个心得newfile的输入fd4
    ls >&4      将ls的结果输入到fd4中
    exec 5<&4   创建fd4的拷贝gd5
    exec 3<&-   关闭fd3
    exec在读入时会一行一行的读 而sort或者cat 每次读入一行都会关闭文件然后再打开读入下一行

    xargs命令
    ls|grep -v info|xargs rm

    猜你喜欢

    转载自tjcjc.iteye.com/blog/790452