Questions tagged «bash»

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

2
读取-a数组-d'\ n'<foo,退出代码1
如果我尝试执行 read -a fooArr -d '\n' &lt; bar 退出代码为1-即使它完成了我想要的操作;将每行放入bar数组的元素中fooArr(使用bash 4.2.37)。 有人可以解释为什么会这样吗 我发现了其他解决方法,例如下面的方法,所以这不是我要的。 for ((i=1;; i++)); do read "fooArr$i" || break; done &lt; bar 要么 mapfile -t fooArr &lt; bar
8 bash  newlines  read 

3
将现有的提示命令行分成几行
我知道我可以\ enter在bash命令行末尾键入以在另一行中继续该命令。但是,如何将一个已经完全键入的提示命令行分成两个? 例如,如何才能在then不切掉其余部分并重新键入之前立即中断此行? $ if true; then ls; fi


5
bash getopts,仅短选项,全部需要值,自己进行验证
我正在尝试建立一个接受各种选项的shell脚本,这getopts似乎是一个不错的解决方案,因为它可以处理选项和参数的变量顺序(我认为!)。 我只使用简短选项,每个简短选项都需要一个相应的值,例如::./command.sh -a arga -g argg -b argb但我希望允许以非特定顺序输入选项,因为大多数人习惯于使用Shell命令。 另一点是,我希望对case语句参数值进行自己的检查,最好是在语句中进行检查。原因是我:)在case陈述中对的测试产生了不一致的结果(可能是由于缺乏理解)。 例如: #!/bin/bash OPTIND=1 # Reset if getopts used previously if (($# == 0)); then echo "Usage" exit 2 fi while getopts ":h:u:p:d:" opt; do case "$opt" in h) MYSQL_HOST=$OPTARG ;; u) MYSQL_USER=$OPTARG ;; p) MYSQL_PASS=$OPTARG ;; d) BACKUP_DIR=$OPTARG ;; \?) echo …
8 bash  getopts 

2
Bash中的正则表达式问题:[^ negate]似乎不起作用
当我ls /directory | grep '[^term]'在Bash中执行时,我得到一个常规清单,好像该grep命令被某种方式忽略了。我尝试使用进行相同的操作egrep,尝试使用双引号和单引号将其使用,但没有更好的结果。当我尝试时,ls /directory | grep '^[term]我得到所有以term开头的条目-符合预期。 我已经在一个在线编辑器中试用了此命令,可以在其中测试我的正则表达式,并且可以正常工作。但不是在Bash中。因此它可以在模拟中工作,但不能在现实生活中工作。 我正在使用Crunchbang Linux10。我希望这是足够的信息,并且期待每一个提示,因为未能在这样的基本级别上执行和浪费时间确实令人沮丧!

2
在Linux上删除包含日期戳作为文件名一部分的文件的更干净方法
我有一个新要求,要清除30天以上的MySQL转储文件。这些文件使用“ all-mysql-YYYYMMDD-HHMM.dump”的命名约定。这些文件位于SAN挂载的文件系统上,因此恢复不是问题,但是不幸的是,驱动器空间有限并且很快就会填满,因此需要频繁的人为干预。 文件名示例 全部-mysql-20130324-2330.dump 全部-mysql-20130325-2330.dump 全部-mysql-20130326-2330.dump 我首先想到的是在带有-mtime +30的批处理脚本中使用“查找”,但是,修改时间无法保证,某些较早的归档文件可能会清除清除日期:) 我创建了以下BASH脚本,但我希望有一种更干净的方法来执行此操作。 #!/bin/bash STARTING_DIR=$(pwd) FILE_PREFIX=all-mysql- BACKUP_DIR=/opt/backup/mysql/dumps ARCHIVE_WINDOW_DAYS=30 cd $BACKUP_DIR # Create YYYYMMDD datestamp for Today - $ARCHIVE_WINDOW_DAYS ARCHIVE_WINDOW_IN_SECS=$(echo "$(date +%s) - (${ARCHIVE_WINDOW_DAYS} * 86400)" | bc) PURGE_BEFORE_DATE=$(date -d @${ARCHIVE_WINDOW_IN_SECS} +%Y%m%d) for backup_file in $FILE_PREFIX* do # Trim prefix, time portion of date stamp, …
8 linux  bash  files 

4
重定向并记录脚本输出
我正在尝试整理以下代码段,设计目标是记录脚本的所有输出,而不应该是包装器。线越少越好。 我不在乎用户输入(在此阶段),目标脚本是非交互式运行的。 该代码段需要 输出标准输出到日志,并始终回显到控制台 输出stderr记录日志,并回显到控制台,如果已启用调试 stderr消息应带有时间戳和其他用途 目前,我有以下内容只能在最新版本的bash(4.2+?)下进行测试,例如在Ubuntu精确版中,但是在CentOS6上表现不佳。 DEBUG_LOG="${0##*/}.log" # copy stdout to log always and echo to console exec &gt; &gt;(tee -a ${DEBUG_LOG}) # copy stderr to log only, unless debugging is enabled [ $DEBUG_TEST = "true" ] \ &amp;&amp; exec 2&gt; &gt;(tee -a ${DEBUG_LOG} &gt;&amp;2) \ || exec 2&gt;&gt; …

2
[[$ variable]]和[[-n $ variable]]之间的区别?
用bash表示,[[ $variable ]]并且[[ -n $variable ]]完全等效吗?从下面的输出来看,似乎是这种情况,但是我看到两种用法都在shell脚本中很普遍。 $ z="abra" $ [[ $z ]] $ echo $? 0 $ [[ -n $z ]] $ echo $? 0 $ z="" $ [[ $z ]] $ echo $? 1 $ [[ -n $z ]] $ echo $? 1 $ unset z $ [[ $z …
8 bash  shell  test 

1
如何根据登录用户更改屏幕的硬状态颜色?
我已经有一段时间没有编辑/创建.screenrc文件了,但这是我目前正在使用的文件: # Turn off the screen startup message startup_message off # Define format of bottom navigation/status/date/etc. line hardstatus alwayslastline "%{yk}[ %H ] %-Lw%50&gt;%{gk}(%{-}%n-%t%{gk})%{-}%+Lw%&lt; %=%{yk}[ %c %d.%m.%Y ]" # Increase scrollback buffer to 30000 lines defscrollback 30000 老实说,我不记得我的hardstatus行中的所有内容代表什么,但是我想弄清楚如何根据登录的用户更改主机名颜色。这是否可能?现在,当我以任何用户身份登录时,主机名都是黄色。但如果我是root,我希望它是红色的。这可以在我的.bashrc文件中更改吗?我在.bashrc中拥有此功能,可以将新的屏幕窗口名称更改为我连接到的服务器的主机名: # Set screen window title case "$TERM" in screen) PROMPT_COMMAND='echo -ne "\033k$HOSTNAME\033\\"' ;; …

2
从DVD中读取标题?
我注意到每个DVD映像都有一个半唯一的大写名称。我是否有一种标准化的方法可以简单地以Linux的非root用户身份读取此名称?我在运行内核3.7的Ubuntu 12.04衍生产品上。我想简单地获取驱动器中当前的任何磁盘的名称,如下所示: DVD_NAME="$( ./read-dvd-name.sh )"
8 bash  dvd 

1
环境变量和外壳变量之间的区别
据说环境变量是在子进程中继承的,而shell变量不是。但是,以下测试表明,在子进程中可以看到shell变量,就像在环境变量中一样。有什么区别? &gt; bash --version GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu) Copyright (C) 2007 Free Software Foundation, Inc. &gt; export TEST="ENV_TEST" #env var &gt; sh -c "echo \$TEST" ENV_TEST &gt; TEST="SHELL_TEST" #shell var &gt; sh -c "echo \$TEST" #shell var is seen in child process SHELL_TEST

2
cp -f无法覆盖cp -i别名
在我的/home/user/.bashrc文件中,我有那些别名可以防止错误: alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' 如果我真的确定自己在做什么,则可以使用或覆盖rm和mv别名,它不会问我是否真的要覆盖文件。rm -fmv -f 问题是,它不适用于该cp命令,使用cp -f仍然会问我一个问题。 这正常吗?为了在cp -i默认情况下具有别名并也能够使用cp -f命令,我该怎么办? 我正在使用Debian Wheezy 64bit。
8 bash  alias 

2
为什么这种“读取时”在终端中起作用,而在Shell脚本中却不起作用?
我在用信息文本填充WM栏时遇到了一个有趣的问题,该信息文本是通过设置根窗口的标题来应用的,即 xsetroot -name "clever words" 为此,在终端机上打印一笔财富可以正常工作: fortune -s | while read -r; do xsetroot -name "$REPLY"; done 但是,从shell脚本运行时,同样会失败: #!/bin/sh cat /tmp/afile | while read; do echo "$REPLY"; done 产生: $ sh afilereader afilereader:2:读取:arg计数 当然,可以通过将我们的财富结果分配给一个变量,然后将xsetroot与所述变量一起使用来补救。但是我仍然想了解为什么这在脚本中不起作用。 我意识到管道两侧的每个命令都在其自己的子外壳中运行,但是看不到它们的局部变量如何影响while读取循环。还是变量甚至在循环迭代之间都超出范围? 我想念什么? 更新:在sh我以前被链接到仪表板,这是正在取得POSIX兼容的过程。使用比较古老的bash解决了这个问题。

2
在awk中使用shell变量
这是我的脚本(查找包含指定模式的文件): find . -type f \ -exec awk -v vawk="$1" '/'"$vawk"'/ {c++} c&gt;0 { print ARGV[1]; exit 0 } END { if (! c) {exit 1}}' \{\} \; 我想将我的脚本与参数§一起使用: MyScript.sh pattern 我的问题是我无法将$1变量放入awk。 当我尝试调试脚本时 bash -x MyScript.sh pattern 这是输出: + find . -type f -exec awk -v vawk=pattern '// {c++} c&gt;0 …
8 bash  awk  variable 


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.