Questions tagged «bash»

有关为Bash命令外壳编写的脚本的问题。对于具有错误/语法错误的shell脚本,请在此处发布之前,使用shellcheck程序(或在Web shellcheck服务器中的https://shellcheck.net)进行检查。有关Bash交互使用的问题更可能是Super User而不是Stack Overflow上的话题。

4
如何使用Bash递归创建不存在的子目录?
我正在创建一个快速备份脚本,该脚本会将一些数据库转储到一个漂亮的/整洁的目录结构中,我意识到我需要在创建目录之前进行测试,以确保目录存在。我拥有的代码可以运行,但是似乎有更好的方法可以做到这一点。有什么建议? [ -d "$BACKUP_DIR" ] || mkdir "$BACKUP_DIR" [ -d "$BACKUP_DIR/$client" ] || mkdir "$BACKUP_DIR/$client" [ -d "$BACKUP_DIR/$client/$year" ] || mkdir "$BACKUP_DIR/$client/$year" [ -d "$BACKUP_DIR/$client/$year/$month" ] || mkdir "$BACKUP_DIR/$client/$year/$month" [ -d "$BACKUP_DIR/$client/$year/$month/$day" ] || mkdir "$BACKUP_DIR/$client/$year/$month/$day"

9
在bash中读取具有默认值的变量
我需要在bash脚本中从终端读取一个值。我希望能够提供用户可以更改的默认值。 # Please enter your name: Ricardo^ 在此脚本中,提示为“请输入您的名称:”,默认值为“里卡多”,光标将位于默认值之后。有什么办法可以在bash脚本中做到这一点?
191 bash  shell 

7
正确的Bash和Shell脚本变量大写
我遇到了很多都带有大写字母的变量的shell脚本,而且我一直认为这有一个严重的误解。我的理解是,按照惯例(也许很久以前就有必要了),环境变量是大写的。 但是在像Bash这样的现代脚本环境中,我一直首选使用小写的名称表示临时变量,而使用大写的名称表示导出(即环境)变量。例如: #!/usr/bin/env bash year=`date +%Y` echo "It is $year." export JAVA_HOME="$HOME/java" 这一直是我对事情的看法。是否有任何权威人士同意或不同意这种方法,或者纯粹是风格问题?

16
从Bash脚本更改当前目录
是否可以通过脚本更改当前目录? 我想在Bash中创建用于目录导航的实用程序。我创建了一个如下所示的测试脚本: #!/bin/bash cd /home/artemb 当我从Bash shell执行脚本时,当前目录不会更改。是否可以通过脚本更改当前的shell目录?
190 bash  environment 

3
反复运行shell命令,直到失败?
我写了一个模糊测试,失败了。我添加了一些调试代码,但是现在我想运行测试直到失败,这样我才能收集调试输出。 我已经设置了测试,因此可以使用以下命令运行它: ./runtest 我当前的解决方案是编写一个untilfail脚本: #!/bin/bash $@ while [ $? -eq 0 ]; do $@ done 然后使用它: untilfail ./runtest 有没有更简单的解决方案?
190 bash 

18
如何在变量中存储标准错误
假设我有一个类似以下的脚本: 无用的 echo "This Is Error" 1>&2 echo "This Is Output" 我还有另一个shell脚本: AlsoUseless.sh ./useless.sh | sed 's/Output/Useless/' 我想从useless.sh中捕获“ This Is Error”或任何其他stderr到变量中。我们称它为ERROR。 请注意,我正在使用stdout做某事。我想继续使用stdout,因此在这种情况下,将stderr重定向到stdout并没有帮助。 所以,基本上,我想做 ./useless.sh 2> $ERROR | ... 但这显然行不通。 我也知道我能做 ./useless.sh 2> /tmp/Error ERROR=`cat /tmp/Error` 但这是丑陋且不必要的。 不幸的是,如果没有答案,这就是我要做的。 我希望有另一种方式。 有人有更好的主意吗?



6
如果stdin输入为空,如何忽略xargs命令?
考虑以下命令: ls /mydir/*.txt | xargs chown root 目的是将所有文本文件的所有者更改mydir为root 问题是,如果其中没有.txt文件,mydir则xargs会引发错误,指出未指定路径。这是一个无害的示例,因为会引发错误,但是在某些情况下,例如在我需要在此处使用的脚本中,假定空白路径为当前目录。因此,如果我/home/tom/从那时开始运行该命令,如果没有结果,ls /mydir/*.txt并且所有文件/home/tom/的所有者都更改为root。 那么,如何让xargs忽略空结果?
188 bash  centos  xargs 


13
在bash中将数组作为参数传递
如何将数组作为参数传递给bash函数? 注意:在此处没有关于Stack Overflow的答案之后,我自己发布了一些粗略的解决方案。它只允许传递一个数组,它是参数列表的最后一个元素。实际上,它根本不是传递数组,而是传递其元素的列表,这些元素可以通过named_function()重新组装成数组,但是它对我有用。如果有人知道更好的方法,请随时在此处添加。
188 arrays  bash 

13
确定bash中是否存在函数
目前,我正在做一些从bash执行的单元测试。单元测试是在bash脚本中初始化,执行和清理的。该脚本通常包含init(),execute()和cleanup()函数。但是它们不是强制性的。我想测试它们是否定义。 之前,我是通过摸索和诱骗来源来做到这一点的,但这似乎是错误的。有没有更优雅的方法可以做到这一点? 编辑:以下代码段就像一个超级按钮一样工作: fn_exists() { LC_ALL=C type $1 | grep -q 'shell function' }

4
无效命令代码,尽管使用转义符,但使用sed
被迫对当前客户端使用CVS,并且为远程仓库更改了地址。我可以找到在本地代码中更改远程地址的唯一方法是递归搜索和替换。 但是,我希望使用sed命令可以工作: find ./ -type f -exec sed -i "s/192.168.20.1/new.domain.com/" {} \; 我收到每个文件的错误: sed: 1: ".//file/path ...": invalid command code . 我试图逃脱sed比赛/替换中的句点,但这并不能解决任何问题。
187 bash  macos  sed 


6
在while循环内修改的变量不被记住
在下面的程序中,如果我$foo在第一条if语句中将变量设置为值1 ,则它的工作方式是在if语句之后记住其值。但是,当我将相同的变量设置if为while语句内部的值2时,在while循环后将其忘记。就像我$foo在while循环中使用某种形式的变量副本,而我只修改该特定副本一样。这是一个完整的测试程序: #!/bin/bash set -e set -u foo=0 bar="hello" if [[ "$bar" == "hello" ]] then foo=1 echo "Setting \$foo to 1: $foo" fi echo "Variable \$foo after if statement: $foo" lines="first line\nsecond line\nthird line" echo -e $lines | while read line do if [[ "$line" == "second line" ]] …
186 bash  while-loop  scope  sh 

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.