Questions tagged «bash»

与其他Bourne / POSIX shell相对,GNU的Bourne Again SHell特有的问题。对于一般关于Unix shell的问题,请改用/ shell标记。

4
间接返回数组中的所有元素
Bash手册页描述了使用${!a}来返回变量名称的内容,该变量的名称是内容的名称a(间接级别)。 我想知道如何使用此方法返回数组中的所有元素,即 a=(one two three) echo ${a[*]} 退货 one two three 我想要: b=a echo ${!b[*]} 返回相同的。不幸的是,它不是,而是返回0。 更新资料 有了这些答复,我现在意识到我的示例太简单了,因为类似这样: b=("${a[@]}") 完全可以实现我所说的需求。 所以,这就是我想要做的: LIST_lys=(lys1 lys2) LIST_diaspar=(diaspar1 diaspar2) whichone=$1 # 'lys' or 'diaspar' _LIST=LIST_$whichone LIST=${!_LIST[*]} 当然,仔细阅读Bash手册页会发现这并不符合预期,因为最后一行只是返回“数组”的索引$_LIST(根本不是数组)。 在任何情况下,都应执行以下操作(如前所述): LIST=($(eval echo \${$_LIST[*]})) 或...(最终我走的路线): LIST_lys="lys1 lys2" ... LIST=(${!_LIST}) 当然,假设元素不包含空格。
10 bash  array 

1
如何在带有条的命令行中为多个变量分配值
我本质上是在尝试将shell命令的输出的某些部分分配给多个变量,但是我不知道该怎么做。 为了简单起见,假设执行时在shell上的命令可以打印 one two three four 可以用 echo "one two three four" (尽管实际的建议不同) 现在,我想将输出的第二个和第四个单词(在本例中为两个和四个)分配给变量w1和w2。 我以为我可以像这样使用read命令: echo "one two three four" | awk '{print $2 " " $4}' | read w1 w2 但这不起作用,可能是因为read命令是在子进程中执行的。 那么,我将如何实现自己的追求?
10 shell  bash 

2
初始化Bash变量-随需应变,建议或定义
在将脚本中的bash变量的值赋给实际值之前,在主代码之前或在函数中的局部变量之前初始化脚本中的bash变量的值是否有任何优点/缺点? 我需要做这样的事情吗? init() { name="" name=$1 } init "Mark" 是否存在使用垃圾值初始化变量(如果未初始化)以及对变量值产生负面影响的风险?
9 bash  variable 

3
`]`的令牌标识符是什么?
Bash手册说: 使用[形式时,命令的最后一个参数必须为]。 $ type [ [ is a shell builtin $ type ] bash: type: ]: not found 因此,]它不是保留字,也不是运算符,也不是内置命令。 作为令牌,令牌标识符是]什么?单词还是名字?
9 bash 


5
如何以事务方式复制文件?
我想将文件从A复制到B,这可能在不同的文件系统上。 还有一些其他要求: 副本是全部或全部,崩溃时不保留任何部分或损坏的文件B; 不要覆盖现有文件B; 不要与并发执行同一命令竞争,最多只能成功。 我认为这很接近: cp A B.part && \ ln B B.part && \ rm B.part 但是3.如果B.part存在(即使带有-n标志),则cp不会违反cp违反。随后,如果其他进程“赢得” cp并且链接到位的文件不完整,则可能1.失败。B.part也可能是不相关的文件,但在这种情况下如果不尝试其他隐藏名称,我很乐意失败。 我认为bash noclobber会有所帮助,这样是否可以充分发挥作用?有没有没有bash版本要求的方法? #!/usr/bin/env bash set -o noclobber cat A > B.part && \ ln B.part B && \ rm B.part 跟进,我知道某些文件系统无论如何都会失败(NFS)。有没有办法检测这种文件系统? 其他一些相关但不完全相同的问题: 跨文件系统的近似原子移动? 我的FS上的MV是原子的吗? 有没有办法将文件和目录从tempf原子地移动到eMMC上的ext4分区 https://rcrowley.org/2010/01/06/things-unix-can-do-atomically.html
9 linux  bash  cp 

4
循环性能与扩展性能
需要以下比较的专家建议: 使用循环的代码段: for file in `cat large_file_list` do gzip -d $file done 使用简单扩展的代码段: gzip -d `cat large_file_list` 哪一个会更快?必须操纵大数据集。

6
将标准输入的最后一行添加到整个标准输入
考虑以下脚本: tmpfile=$(mktemp) cat <<EOS > "$tmpfile" line 1 line 2 line 3 EOS cat <(tail -1 "$tmpfile") "$tmpfile" 这可以工作并输出: line 3 line 1 line 2 line 3 假设我们的输入源不是实际文件,而是stdin: cat <<EOS | # what goes here now? line 1 line 2 line 3 EOS 我们如何修改命令: cat <(tail -1 "$tmpfile") "$tmpfile" 这样在不同的上下文中它仍会产生相同的输出? …
9 bash 

1
为什么与以破折号开头的CLI参数一起使用时,代字号(〜)不会展开?
我花了几个小时试图运行VNC服务器(x0vncserver),并且客户端拒绝连接并发出奇怪的消息, No password configured for VNC Auth 服务器还会打印此错误 SVncAuth: opening password file '~/.vnc/passwd' failed 好的,我浪费了很多时间,直到意识到波浪号既没有被shell扩展,也没有被x0vncserver扩展。然后我进行了这些测试 $ echo --PasswordFile=~/.vnc/passwd --PasswordFile=~/.vnc/passwd 但 $ echo PasswordFile=~/.vnc/passwd PasswordFile=/home/tichomir/.vnc/passwd 这是为什么?如果参数以短划线开头,为什么shell拒绝扩展代字号?我认为只要不加引号,波浪号就会一直扩展,但是显然还有另外一条规则在起作用吗?
9 bash  shell  tilde 

3
如何防止不支持的“购物”选项引起我的.bashrc错误?
我在相对异构的环境中工作,其中我可能在不同的HPC节点,VM或我的个人工作站上运行不同版本的Bash。因为我将登录脚本放在了Git仓库中,所以我想全面使用相同.bashrc的命令,而不会出现很多“如果是此主机,则...”类型的混乱情况。 我喜欢 Bash≤4.1的默认行为,该行为会在按下键时扩展cd $SOMEPATH为。在bash 4.2及以上,则需要重新启用此行为,而这并没有变得可用,直到4.2.29。不过,这只是一个例子。另一个可能相关的选项(尽管我不确切知道它的作用)也可能更改了v4.2的默认行为。cd /the/actual/pathTabshopt -s direxpandshoptcomplete_fullquote 但是,direxpand早期版本的Bash无法识别该错误,如果我尝试在shopt -s direxpand中运行.bashrc,则每次我使用较旧的Bash登录到节点时,都会在控制台上显示一条错误消息: -bash: shopt: direxpand: invalid shell option name 我想做的是环绕一个条件,shop -s direxpand以一种健壮的方式在Bash> 4.1上启用该选项,而不会破坏Bash的旧版本(即,不仅仅将错误输出重定向到/dev/null)。

3
“使”符号“可变”(后台处理)
我想知道是否有办法将&符放入变量中,并仍然使用它来将进程发送到后台。 这有效: BCKGRND=yes if [ "$BCKGRND" = "yes" ]; then sleep 5 & else sleep 5 fi 但是,仅用一条完成这五条线不是很酷吗?像这样: BCKGRND='&' sleep 5 ${BCKGRND} 但这是行不通的。如果未设置BCKGRND,则它可以工作-但是,如果设置了BCKGRND,则将其解释为文字'&'并输出错误。

2
bash:echo:写错误:系统调用中断
我想生成一个包含所有8位数字的排序列表-从00000000到99999999。我在shell中键入: f() { while IFS="" read -r line; do for i in {0..9}; do echo "$line$i"; done; done } echo | f | f | f | f | f | f | f | f | tee result.txt | wc -l 回应是 bash: echo: write error: Interrupted system call …
9 bash 

3
如何在bash中打印由TAB分隔的字符串?
我正在尝试打印两个由TAB分隔的字符串。我努力了: echo -e 'foo\tbar' printf '%s\t%s\n' foo bar 他们两个都打印: foo bar 两者之间的空白实际上是5个空格(根据在Putty中用鼠标选择输出)。 我也尝试使用CTRL + V并在键入命令时按TAB键,结果相同。 强制将标签打印为标签的正确方法是什么,以便我可以选择输出并将其复制到带有标签的其他位置? 第二个问题是:bash为什么将制表符扩展为空格? 更新:显然,这是腻子的问题:https : //superuser.com/questions/656838/how-to-make-putty-display-tabs-within-a-file-instead-of-changing-them-to -空间

2
动态构建命令
我正在编写脚本,因此需要tar动态生成命令。 这是两个示例,以说明我要执行的操作: #!/bin/bash TAR_ME="/tmp" EXCLUDE=("/tmp/hello hello" "/tmp/systemd*" "/tmp/Temp*") _tar="tar "`printf -- '--exclude="%s" ' "${EXCLUDE[@]}"`" -zcf tmp.tar.gz" echo COMMAND: "${_tar}" ${_tar} "$TAR_ME" echo -e "\n\nNEXT:\n\n" EXCLUDE=("--exclude=/tmp/hello\ hello" "--exclude=/tmp/systemd*" "--exclude=/tmp/Temp*") _tar="tar "`printf -- '%s ' "${EXCLUDE[@]}"`" -zcf test.tar.gz" echo COMMAND: "${_tar}" ${_tar} "$TAR_ME" 我希望能够_tar用作命令,已经能够使其与经典路径一起使用,但是我需要它与文件夹名称中的空格一起使用。而且每一次我都会看到类似以下的错误: COMMAND: tar --exclude="/tmp/hello hello" --exclude="/tmp/systemd*" --exclude="/tmp/Temp*" -zcf tmp.tar.gz …

6
Bash根据元素的长度对数组进行排序?
给定一个字符串数组,我想根据每个元素的长度对该数组进行排序。 例如... array=( "tiny string" "the longest string in the list" "middle string" "medium string" "also a medium string" "short string" ) 应该排序为... "the longest string in the list" "also a medium string" "medium string" "middle string" "short string" "tiny string" (此外,如果列表按字母顺序对相同长度的字符串进行排序,那将是很好的选择。在上面的示例medium string中,middle string即使它们的长度相同,也对它们进行了排序。但这不是一个“硬”的要求,如果这样会使字符串复杂化,解)。 可以就地对数组进行排序(即修改“数组”)或创建新的排序数组都可以。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.