如果条件为真而没有终止整个脚本,你将如何退出函数,只需在调用函数之前返回.
例
# 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) 我在这做错了什么?
尝试匹配包含空格,小写,大写或数字的任何字符串.特殊字符也会很好,但我认为这需要转义某些字符.
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) 谁能在这里看到我的语法错误?尝试编辑/更新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) 请帮忙!
我这里有一个时间敏感的问题,所以我转向 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)
再次感谢!
所以我有一个问题,我的脚本的这部分不起作用.我不确定到底发生了什么,但我感觉到它是因为我没有在变量中转义某些字符.我试了以下没有运气:
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) 尝试验证字符串中只包含小写,大写或数字.
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) 我正在尝试创建一个函数数组,以便按顺序遍历每个函数.
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并说找不到命令.我需要它来运行该功能.建议?
知道如何按特定顺序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
为什么你从来没有看到橙色的终端文本?
例如在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)
* 解决方案 *
在这个问题开始时,我并没有真正理解终端。如果你和我一样,请参考这个网站来回答你的问题:
我有一个函数,该函数内部有一个 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”是否导致脚本中断循环而不是函数?
谢谢