shell命令之bash

bash命令

bash命令:bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行,只有那些引用了Bourne特殊变量或使用了Bourne的内置命令的脚本才需要修改。bash的命令语法很多来自Korn shell(ksh)和C shell(csh)

花括号扩展:
1、花括号扩展是一个从C shell借鉴而来的特性,它产生一系列指定的字符串(按照原先从左到右的顺序)。这些字符串不需要是已经存在的文件。
root@sonic:/home/admin# echo a{p,c,d,b}e
ape ace ade abe
root@sonic:/home/admin# echo {a,b,c}{d,e,f}
ad ae af bd be bf cd ce cf

2、当花括号扩展和通配符一起使用时,花括号扩展首先被解析,然后正常解析通配符。因此,可以用这种方法获得当前目录的一系列JPEG和PEG文件。
ls .{jpg,jpeg,png} # 首先扩展为.jpg *.jpeg *.png,然后解析通配符
echo *.{png,jp{e,}g} # echo显示扩展结果;花括号扩展可以嵌套。

3、用“…”在花括号扩展中指定字符或数字范围。较新的Bash版本接受一个整数作为第三个参数,指定增量。
$ echo {1…10}
1 2 3 4 5 6 7 8 9 10
$ echo file{1…4}.txt
file1.txt file2.txt file3.txt file4.txt
$ echo {a…e}
a b c d e
$ echo {1…10…3}
1 4 7 10
$ echo {a…j…3}
a d g j

4、当花括号扩展和变量扩展一起使用时,变量扩展解析于花括号扩展之后。有时有必要使用内置的eval函数
$ start=1; end=10
$ echo { s t a r t . . start.. start..end} # 由于解析顺序,无法得到想要的结果
{1…10}
$ eval echo { s t a r t . . start.. start..end} # 首先进行变量扩展的解析
1 2 3 4 5 6 7 8 9 10

使用整数:
与Bourne shell不同的是bash不用另外生成进程即能进行整数运算。bash使用((…))命令和$[…]变量语法来达到这个目的:

VAR=55 # 将整数55赋值给变量VAR
((VAR = VAR + 1)) # 变量VAR加1。注意这里没有’$’
((++VAR)) # 另一种方法给VAR加1。使用C语言风格的前缀自增
((VAR++)) # 另一种方法给VAR加1。使用C语言风格的后缀自增
echo $((VAR * 22)) # VAR乘以22并将结果送入命令
echo $[VAR * 22] # 同上,但为过时用法
((…))命令可以用于条件语句,因为它的退出状态是0或者非0(大多数情况下是1),可以用于是与非的条件判断:

if((VAR == Y * 3 + X * 2))
then
echo yes
fi

((Z > 23)) && echo Yes
((…))命令支持下列比较操作符:’==‘, ‘!=‘, ‘>‘, ‘<‘, ‘>=‘,和’<=‘。

bash不能在自身进程内进行浮点数运算。当前有这个能力的unix shell只有Korn shell和Z shell。

重定向标准输出至文件,写数据,关闭文件,重置标准输出。

生成标准输出(文件描述符1)的拷贝文件描述符6

exec 6>&1

打开文件"test.data"以供写入

exec 1>test.data

产生一些内容

echo “data:data:data”

关闭文件"test.data"

exec 1>&-

使标准输出指向FD 6(重置标准输出)

exec 1>&6

关闭FD6

exec 6>&-
打开及关闭文件

打开文件test.data以供读取

exec 6<test.data

读文件直到文件尾

while read -u 6 dta
do
echo “$dta”
done

关闭文件test.data

exec 6<&-
抓取外部命令的输出:$() ,括号中为命令

运行’find’并且将结果存于VAR

搜索以"h"结尾的文件名

VAR=$(find . -name “*h”)

关联数组
Bash 4.0 开始支持关联数组,通过类似AWK的方式,对于多维数组提供了伪支持。

$ declare -A a # 声明一个名为a的伪二位数组
$ i=1; j=2
$ a[ i , i, i,j]=5 # 将键 “ i , i, i,j” 与值 5 对应
$ echo KaTeX parse error: Expected '}', got 'EOF' at end of input: {a[i,$j]}

移植性
调用Bash时指定 --posix 或者在脚本中声明 set -o posix ,可以使得Bash几乎遵循 POSIX 1003.2 标准。若要保证一个Bash脚本的移植性,至少需要考虑到 Bourne shell,即Bash取代的shell。Bash有一些传统的 Bourne shell 所没有的特性,包括以下这些:
某些扩展的调用选项
命令替换(即$())(尽管这是 POSIX 1003.2 标准的一部分)
花括号扩展
某些数组操作、关联数组
扩展的双层方括号判断语句
某些字符串生成操作
进程替换
正则表达式匹配符
Bash特有的内置工具
协进程

键盘快捷键
Bash默认使用emacs的快捷键,可以通过 set -o vi 让它使用Vi的快捷键

进程管理
Bash有两种执行命令的模式:批处理模式、并发模式。 要以批处理模式执行命令(即按照顺序),必须用;分隔
command1 ; command2
在这个例子中,当command1执行完毕,即执行command2 要并发执行两个命令,它们必须用&分隔
command1 & command2
在这种情况下,command1 在后台执行(通过&),从而立即将控制返回到shell,以执行command2
总结:
一般命令在前台执行(fg),执行完毕后,控制返回给用户。
在命令后面加上&,它会在后台执行(bg),并将特殊的环境变量$!设置为该任务的进程id。这时shell可以并发执行其他命令。
按Ctrl+z可以挂起前台运行的程序
挂起的程序可以用fg恢复到前台,或者用bg恢复到后台
后台程序试图写入数据到终端设备时(与写入标准输出不同)可能被阻塞。
shell可以等待一个后台任务执行完成,只需使用wait命令,加上进程ID或者任务序号;也可以等待所有的后台任务,只需使用不加参数的wait

启动脚本
bash启动的时候会运行各种不同的脚本。
当bash作为一个登录的交互shell被调用,或者作为非交互shell但带有–login参数被调用时,它首先读入并执行文件/etc/profile。然后它会依次寻找/.bash_profile,/.bash_login,和~/.profile,读入并执行第一个存在且可读的文件。–noprofile参数可以阻止bash启动时的这种行为。
当一个登录shell退出时,bash读取并执行~/.bash_logout文件,如果此文件存在。
当一个交互的非登录shell启动后,bash读取并执行~/.bashrc文件。这个行为可以用–norc参数阻止。–rcfile file参数强制bash读取并执行指定的file而不是默认的~/.bashrc。
如果用sh来调用bash,bash在启动后进入posix模式,它会尽可能模仿sh历史版本的启动行为,以便遵守POSIX标准。用sh名字调用的非交互shell不会去读取其他启动脚本,–rcfile参数无效。
当bash以POSIX模式启动时(例如带有–posix参数)它使用POSIX标准来读取启动文件。在此模式下,交互shells扩展变量env,从以此为文件名的文件中读取命令并执行。
bash会探测自己是不是被远程shell守护程序运行(通常是rshd)。如果是,它会读取并执行~/.bashrc中的命令。但是rshd一般不会用rc相关参数调用shell,也不会允许指定这些参数。

Bash与Bourne shell和csh启动脚本的比较
Bash的特性是从Bourne shell和csh发展而来,因此一定程度上允许同Bourne shell的启动文件共享,并提供一些csh用户熟悉的启动特性。
设置可继承的环境变量
Bourne shell登陆时使用 ~/.profile 来设置环境变量,这些环境变量可以被子进程继承。Bash可以以兼容的方式使用~/.profile ,只需在Bash自有的脚本中显式执行下面这行代码。通过在~/.profile 中避免使用Bash特有的语法,就可以和Bourne shell保持兼容性。
. ~/.profile

别名和函数
更通用的函数以及借鉴自csh的“别名(alias)”很大程度上取代了Bourne shell的别名(alias)和函数。然而这两个特性一般不能从登录式shell中继承,在该登录式shell的子shell中,它们必须被重新定义。尽管有个环境变量ENV可以被用于这个问题,不过 csh 和 Bash 都可以用子shell的启动脚本直接处理。在Bash当中,~/.bashrc 是交互式子shell启动时执行的脚本。如果想要在登录式shell中使用 ~/.bashrc 定义的函数,可以在 ~/.bash_login 的环境变量后面加上这样一行:
. ~/.bashrc
登录与退出时执行的命令
最初登录时,csh 执行 ~/.login ,可以执行一些只在登录时执行的操作,例如显示系统负载、硬盘状态、是否收到新邮件、在日志中记录登录时间,等等。Bourne shell 可以在 ~/.profile 文件中模拟这种行为,但并没有预先定义文件名。可以在 ~/.bash_profile 文件的环境变量设置和函数定义的后面添加这样一行:
. ~/.bash_login
与之类似,csh还有一个文件 ~/.logout ,这个文件只在登录式shell退出时执行。Bash与之对应的文件是 ~/.bash_logout ,并且不需要专门的设置。在 Bourne shell 中,trap这个内置工具可以实现类似的效果。

兼容旧环境的Bash启动脚本示例
下面这个 ~/.bash_profile 的框架与 Bourne shell 兼容,并且为 ~/.bashrc 和 ~/.bash_login 提供类似于 csh 的语义。[ -r 文件名] 测试指定文件是否存在,如果不存在,跳过 && 后面的部分

[ -r ~/.profile ] && . ~/.profile # 只使用Bourne shell的语法设置环境变量
if [ -n “$PS1” ] ; then # 判断是否是交互式shell
[ -r ~/.bashrc ] && . ~/.bashrc # 加载~/.bashrc(tty、prompt、函数设置等)
[ -r ~/.bash_login ] && . ~/.bash_login # 执行登录式shell登录时的任务
fi # if块的结束标志
Bash 启动脚本与操作系统相关的问题
一些 Unix 和 Linux 版本常在 /etc 放置 Bash 的系统级启动脚本。Bash在其标准的初始化过程中执行它们,不过其他启动脚本可以按照不同于Bash启动序列文档所述的顺序来读取这些文件。root 用户的文件默认内容,以及新用户被创建时系统提供的默认文件可能有问题。启动 X窗口系统 的启动脚本可能使用用户的 Bash 启动脚本尝试在 窗口管理器 启动之前设置用户的环境变量。这些问题常常可以通过使用 ~/.xsession 或者 ~/.xprofile 来读取 ~/.profile 而解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: bash shell命令是一种在Linux和Unix操作系统中使用的命令行界面。它可以让用户通过键入命令来执行各种操作,例如浏览文件系统、管理进程、安装软件等。常用的bash shell命令包括ls、cd、mkdir、rm、cp、mv、grep、awk、sed等。这些命令可以通过man命令来查看其详细用法和参数。 ### 回答2: Bash shell是一种常用的命令行界面,用于执行各种操作系统命令和脚本。它是Linux操作系统默认的shell,也可以在Windows和Mac OS中安装。 Bash shell可以执行各种命令,包括文件和目录操作、系统管理、文本处理、网络通信等。例如,使用ls命令可以列出当前目录下的文件和文件夹,使用cd命令可以切换目录,使用mkdir命令可以创建新的目录。 bash shell还提供了强大的文件和文本处理功能。使用cat命令可以显示文件内容,使用grep命令可以搜索文件中的特定字符串。利用重定向和管道操作,我们可以将一个命令的输出作为另一个命令的输入,实现更复杂的操作。 bash shell还支持变量和条件语句。我们可以使用变量存储数据,并在脚本中引用它们。条件语句(如if-else语句)可以根据条件执行不同的命令或代码块。 脚本是bash shell的一个重要特性。我们可以将一系列命令存储在一个文件中,然后使用bash shell执行该文件。这样可以方便地进行自动化任务,如批量处理文件、定时执行任务等。 总之,bash shell是一种强大而灵活的命令行工具,它在Linux系统中发挥着重要作用。它提供了多种命令和功能,方便用户进行各种操作和脚本编写。熟练掌握bash shell命令可以提高工作效率,简化操作流程。 ### 回答3: Bash Shell是一种命令行解释器,常用于UNIX和Linux操作系统中。它提供了一个交互式解释环境,允许用户与操作系统进行交互并执行各种任务。 Bash Shell可以执行和处理各种命令和脚本。它提供了许多内置的命令,可以用来管理文件和目录、处理文本、查看进程、配置系统等。此外,Bash Shell还支持通配符、管道和重定向等功能,可以更方便地处理和操作数据。 在Bash Shell中,可以使用各种命令来执行不同的任务。例如,可以使用"ls"命令来列出目录中的文件和文件夹,使用"cd"命令来切换当前工作目录,使用"cp"命令来复制文件,使用"grep"命令来搜索指定模式的文本等。 除了执行单个命令外,还可以使用Bash Shell脚本来编写一系列命令的集合,以实现更复杂的任务和自动化操作。脚本可以包含流程控制结构,如条件语句和循环语句,以便根据需要执行相应的命令。 总之,Bash Shell是一种功能强大的命令行解释器,可以通过执行各种命令和编写脚本来完成多种任务。无论是日常的文件管理还是系统配置,Bash Shell都是一个重要的工具。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值