小编Ato*_*lan的帖子

如何在bash中退出函数

如果条件为真而没有终止整个脚本,你将如何退出函数,只需在调用函数之前返回.

# Start script
Do scripty stuff here
Ok now lets call FUNCT
FUNCT
Here is A to come back to

function FUNCT {
  if [ blah is false ]; then
    exit the function and go up to A
  else
    keep running the function
  fi
}
Run Code Online (Sandbox Code Playgroud)

bash function exit

72
推荐指数
3
解决办法
8万
查看次数

在Bash if语句中匹配正则表达式

我在这做错了什么?

尝试匹配包含空格,小写,大写或数字的任何字符串.特殊字符也会很好,但我认为这需要转义某些字符.

TEST="THIS is a TEST title with some numbers 12345 and special char *&^%$#"

if [[ "$TEST" =~ [^a-zA-Z0-9\ ] ]]; then BLAH; fi
Run Code Online (Sandbox Code Playgroud)

这显然只测试上,下,数字和空格.虽然不起作用.

*更新*

我想我应该更具体一点.这是实际的实际代码行.

if [[ "$TITLE" =~ [^a-zA-Z0-9\ ] ]]; then RETURN="FAIL" && ERROR="ERROR: Title can only contain upper and lowercase letters, numbers, and spaces!"; fi
Run Code Online (Sandbox Code Playgroud)

*更新*

./anm.sh: line 265: syntax error in conditional expression
./anm.sh: line 265: syntax error near `&*#]'
./anm.sh: line 265: `  if [[ ! "$TITLE" =~ [a-zA-Z0-9 $%^\&*#] ]]; then …
Run Code Online (Sandbox Code Playgroud)

regex bash if-statement

59
推荐指数
4
解决办法
17万
查看次数

使用bash脚本更新CRON

谁能在这里看到我的语法错误?尝试编辑/更新cron作业,但文件未更新.

crontab -l | sed 's%*/5 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh%' | crontab -
Run Code Online (Sandbox Code Playgroud)

*更新*

所以我仍然遇到麻烦.最终我试图从配置文件$ FREQ(分钟)中提取一个值来运行该作业.该脚本将首先检查配置中的值是否与crontab中当前的值不同.如果值不同,它将使用新值更新crontab.crontab(初始安装和更新)还从变量中提取运行目录和脚本名称.例:

DIR=`pwd`
SCRIPT=`basename $0`
CRONTMP=`crontab -l | grep anm.sh`
crontab -l | sed 's%'$CTMP'%*/'$FREQ' * * * * cd '$DIR' && ./'$SCRIPT'%' | crontab -
Run Code Online (Sandbox Code Playgroud)

沿着那条线的东西.显然这是缺少一些东西,但这应该给你一般的想法.

谢谢您的帮助!

*更新*

好的,事情正在发生,但我仍然有一个小问题.我想我已经制定了大部分逻辑.这是脚本的完整(相关)部分,因此您可以准确地了解我要完成的任务.

请记住:$ SCRIPT和$ DIR是在函数外定义的,只等于脚本名称(例如anm.sh)和当前工作目录.我接受了你的建议并更新了我的所有代码.我现在使用SCRIPT = $(basename $ 0).谢谢

function CRON {
  if [ "`crontab -l | grep $SCRIPT`" \> " " ]; then
    CTMP=$(crontab -l …
Run Code Online (Sandbox Code Playgroud)

linux bash sed crontab

6
推荐指数
1
解决办法
2万
查看次数

awk 将两列放入 bash for 循环中

请帮忙!

我这里有一个时间敏感的问题,所以我转向 Stackoverflow,希望能得到相当快的答复。我不是 bash 专家,尤其是在必须快速思考的时候。我正在尝试将用户数据库中的两列 awk 转换为 OpenStack API。数据库(我创建的平面文件)非常简单。它看起来像这样:

| ID | username | True |
Run Code Online (Sandbox Code Playgroud)

数据库非常大,所以我试图循环遍历它。这是我尝试运行的命令:

for user in $(cat users.txt); do keystone user-role-add --user $user --role blah --tenant $tenant; done
Run Code Online (Sandbox Code Playgroud)

假设 users.txt 列表的每一行都有一个用户名,这非常有效。

我需要修改此命令以从 users.txt 中提取 $user 的用户名,并从 users.txt 中提取 $tenant 的相应 ID

* 解决方案 *

while read line;do
  tenant=$(echo $line|awk '{print $2}')
  user=$(echo $line|awk '{print $4}')
  keystone user-role-add --user $user --role blah --tenant $tenant
done <users.txt
Run Code Online (Sandbox Code Playgroud)

再次感谢!

bash awk

6
推荐指数
2
解决办法
4635
查看次数

转义sed表达式中的变量中的字符

所以我有一个问题,我的脚本的这部分不起作用.我不确定到底发生了什么,但我感觉到它是因为我没有在变量中转义某些字符.我试了以下没有运气:

crontab -l | sed "s%$CTMP%\*\/$FREQ \* \* \* \* cd $DIR && \.\/$SCRIPT%" | crontab -
Run Code Online (Sandbox Code Playgroud)

以下是每个变量中的最新信息:

CTMP变量只是crontab文件中的一行

CTMP='*/5 * * * * cd /home/admin/whatever && ./test.sh'
Run Code Online (Sandbox Code Playgroud)

FREQ变量是cron文件的以分钟为单位的时间设置

FREQ=5
Run Code Online (Sandbox Code Playgroud)

DIR变量是当前的工作目录

DIR='/home/admin/whatever'
Run Code Online (Sandbox Code Playgroud)

而SCRIPT变量只是脚本文件名

SCRIPT='test.sh'
Run Code Online (Sandbox Code Playgroud)

我觉得问题是sed语句没有更新crontab文件,因为它没有转义上面这些变量所需的字符.

这是正确的还是其他错误的?

*更新*

CTMPESC=$(sed 's/[\*\.]/\\&/g' <<<"$CTMP")
DIRESC=$(sed 's/[\*\.]/\\&/g' <<<"$DIR")
SCRIPTESC=$(sed 's/[\*\.]/\\&/g' <<<"$SCRIPT")
crontab -l | sed "s%$CTMPESC%\*/$FREQ \* \* \* \* cd $DIRESC && \./$SCRIPTESC%" | crontab -
Run Code Online (Sandbox Code Playgroud)

*更新*

这是crontab输出

*/10 * * * * cd /home/administrator/anm-1.5.0 */7 * * * * cd /home/administrator/anm-1.5.0 …
Run Code Online (Sandbox Code Playgroud)

bash sed

5
推荐指数
1
解决办法
9134
查看次数

Bash需要测试字母数字字符串

尝试验证字符串中只包含小写,大写或数字.

if ! [[ "$TITLE" =~ ^[a-zA-Z0-9]+$ ]]; then echo "INVALID"; fi
Run Code Online (Sandbox Code Playgroud)

思考?

*更新*

变量TITLE目前只有大写文本,所以它应该通过,不应输出任何内容.但是,如果我向TITLE添加一个特殊字符,IF语句应该捕获它并回显INVALID.目前它不起作用.它总是回声无效.我认为这是因为我的正则表达式是错误的.我想我写它的方式,它寻找一个包含所有三个标题的标题.

Bash 4.2.25

这个想法是,用户应该能够添加任何标题,只要它只包含大写,小写或数字.所有其他角色都应该失败.

*更新*

如果TITLE = ThisIsAValidTitle它回声无效.

如果TITLE = ThisIs @@@@@@@ InvalidTitle,它也无效.

*解决方案*

很奇怪,当我简化它时,它开始工作了:

TEST="Valid0"
if ! [[ "$TEST" =~ [^a-zA-Z0-9] ]]; then
  echo "VALID"
else
  echo "INVALID"
fi
Run Code Online (Sandbox Code Playgroud)

*真正解决方案*

我的变量中有空格...... DUH

对不起麻烦的家伙......

*最终解决方案*

这说明了标题中的空格

if ! [[ "$TITLE" =~ [^a-zA-Z0-9\ ] ]]; then
  echo "VALID"
else
  echo "INVALID"
fi
Run Code Online (Sandbox Code Playgroud)

regex string bash if-statement alphanumeric

5
推荐指数
1
解决办法
2万
查看次数

Bash函数数组

我正在尝试创建一个函数数组,以便按顺序遍历每个函数.

declare -a FUNCTION
FUNCTION[1]="FUNCTION.A"
FUNCTION[2]="FUNCTION.B"
FUNCTION[3]="FUNCTION.C"

for i in "${!FUNCTION[@]}"; do
  ${FUNCTION[$i]};
done
Run Code Online (Sandbox Code Playgroud)

这只是打印出FUNCTION.A并说找不到命令.我需要它来运行该功能.建议?

arrays bash function

5
推荐指数
2
解决办法
3341
查看次数

在从bash创建的tar中排序文件

知道如何按特定顺序tar文件.我知道一开始听起来很奇怪,但是听我说.OVA文件本质上是一个tar文件,但具有特定的顺序.Tar通常用于创建文件,但为了让VMware等HyperVisors能够识别OVA,OVA中的文件必须以非常特定的方式进行排序..ovf文件必须首先在OVA中,其他文件必须按.ovf中列出的顺序出现

这里只是一个帮助解释的快速树:

VM.ova--
       |
       |--VM.ovf
       |--VM.mf
       |--VM.vmdk
       |--VM.iso
Run Code Online (Sandbox Code Playgroud)

这是正确的顺序.当我尝试使用tar创建一个ova时它起作用,但顺序错了.我是这样做的.这实际上非常基础.

tar -cvf VM.ova *
Run Code Online (Sandbox Code Playgroud)

我只是潜入包含需要添加到OVA的所有内容的文件夹并运行tar命令.请帮我正确订购这些文件.如果我们无法解决这个问题,VM将无法使用任何HyperVisor.谢谢!

*更新*

目前tar默认执行的顺序是:vmdk,iso,mf,ovf

linux bash tar ova

5
推荐指数
1
解决办法
3199
查看次数

橙色终端文本

为什么你从来没有看到橙色的终端文本?

例如在python中:

class text_color:
        black = '\033[30m'
        red = '\033[31m'
        green = '\033[32m'
        yellow = '\033[33m'
        blue = '\033[34m'
        magenta = '\033[35m'
        cyan = '\033[36m'
        white = '\033[37m'

# START MAIN
print text_color.yellow + "YAY"
Run Code Online (Sandbox Code Playgroud)

为什么这下面不起作用?为什么你从来没有看到橙色作为一种选择?

orange = '\033[40m'
Run Code Online (Sandbox Code Playgroud)

* 解决方案 *

在这个问题开始时,我并没有真正理解终端。如果你和我一样,请参考这个网站来回答你的问题:

http://misc.flogisoft.com/bash/tip_colors_and_formatting

python linux bash

5
推荐指数
2
解决办法
8535
查看次数

函数 while 循环中如何处理 return ?

我有一个函数,该函数内部有一个 while 循环。

当我尝试使用 IF 语句在 while 循环内设置非局部变量,然后退出整个函数时,突然该变量不再设置?

function EXAMPLE {
  cat test.txt | while read LINE; do
    if [ "$LINE" = "FAIL" ]; then
      echo "Detected FAIL in file! Setting RETURN=fail and exiting function."
      RETURN="fail"
      return
    fi
  done
}

### START SCRIPT ###
EXAMPLE (Call example function)
echo "$RETURN"
Run Code Online (Sandbox Code Playgroud)

由于某种原因,RETURN 为空。不过,我过去已经做过很多很多次了。while 循环的某些问题导致 RETURN 无法从函数中传递出来。“return”是否导致脚本中断循环而不是函数?

谢谢

bash return while-loop

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

bash ×10

linux ×3

function ×2

if-statement ×2

regex ×2

sed ×2

alphanumeric ×1

arrays ×1

awk ×1

crontab ×1

exit ×1

ova ×1

python ×1

return ×1

string ×1

tar ×1

while-loop ×1