GVKun编程网logo

macos – 使bash脚本显示系统事件对话框,然后获取其结果并在if语句中使用它

2

对于macos–使bash脚本显示系统事件对话框,然后获取其结果并在if语句中使用它感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于Bashif语句中带有变量的空格、Bash脚本if语句、

对于macos – 使bash脚本显示系统事件对话框,然后获取其结果并在if语句中使用它感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于Bash if语句中带有变量的空格、Bash脚本if语句、bash脚本中 if 语句 和 for 语句的用法、bash脚本中case语句中的模式的宝贵知识。

本文目录一览:

macos – 使bash脚本显示系统事件对话框,然后获取其结果并在if语句中使用它

macos – 使bash脚本显示系统事件对话框,然后获取其结果并在if语句中使用它

我在macOS上.我有一个脚本,在使用终端读取请求确认后,使用grep检查是否已挂载/ dev / disk1,然后格式化该磁盘.这是一个危险的脚本,因此,为什么先询问它是否合适是至关重要的.

最后,我想让这个脚本成为用户可以双击的可执行文件.但是,不是让用户键入“y”并返回到终端窗口,我宁愿显示“是”和“否”按钮的显示对话框,让他们选择,然后根据他们的答案运行脚本.在bash中这可能吗?

我在一个我没有管理访问权限的环境中工作,所以虽然我可以编写AppleScript服务来完成我想要做的事情并将其优雅地集成到用户界面中,但我无法将该服务集成到没有管理员密码的环境(因为没有它,我无法为用户编辑〜/ Library / Services).此外,我无法下载或安装任何新的库,应用程序 – 任何,真的 – 在环境中;我必须只在Mac OS X中使用原生bash.

这是我有的:

read -p "Are you sure you want to partition this disk? " -n 1 -r # Can I make this be a dialog Box instead?
echo 

if [[ $REPLY =~ ^[Yy]$]] # Can this accept the result as a condition?
then
    if grep -q 'disk1' /dev/ && grep -q 'file.bin' ~/Downloads; then
        echo # redacted actual code
    else
        osascript -e 'tell app "System Events" to display dialog "The disk is not mounted."'
        exit 1
    fi
else
    exit 1
fi

非常感谢您的帮助.

是的,在bash中可以获取osascript对话框的输出.这是一个带有是/否对话框的示例:
#!/bin/bash

SURETY="$(osascript -e 'display dialog "Are you sure you want to partition this disk?" buttons {"Yes","No"} default button "No"')"

if [ "$SURETY" = "button returned:Yes" ]; then
    echo "Yes,continue with partition."
else
    echo "No,cancel partition."
fi

如果运行此脚本,脚本应根据按下的按钮回显相应的行.

它还显示了如何设置默认按钮,我假设示例为“否”.

如果您有一个更复杂的对话框,您很可能会使用正则表达式来检测响应,就像您在自己的示例中一样;虽然根据您的使用情况,您可能希望防止欺骗响应.

Bash if语句中带有变量的空格

Bash if语句中带有变量的空格

有一天,我正在努力进行if声明.转动我们的变量在开头有一个空格.所以我试着用下面的代码来征服它,但我没有运气.

if [ "$COMMAND_WAIT" == "*REBOOT" ]; then
sudo /etc/kca/scripts/reboot.sh
echo "REBOOTING"
fi

我是否应该能够对此声明进行通配符,还是有另外一种解决方法?

解决方法

以下应该有效.它使用[[而不是[,而不是模式周围的引号.

if [[ "$COMMAND_WAIT" == *REBOOT ]]; then
    sudo /etc/kca/scripts/reboot.sh
    echo "REBOOTING"
fi

[[expression]]是一个复合表达式,有关扩展和引用的特殊规则.相反,[是一个内置命令,即* REBOOT将扩展为路径名.在大多数情况下,它更容易使用[[而不是[.

Bash脚本if语句

Bash脚本if语句

在 Bash脚本中,以下片段有什么区别?

1)使用单括号:

if [ "$1" = VALUE ] ; then
 # code
fi

2)使用双括号:

if [[ "$1" = VALUE ]] ; then
 # code
fi

The [[ ]] construct is the more versatile Bash version of [ ]. This is the extended test command,adopted from ksh88.

Using the [[ … ]] test construct,rather than [ … ] can prevent many logic errors in scripts. For example,the &&,||,<,and > operators work within a [[ ]] test,despite giving an error within a [ ] construct.

More info on the Advanced Bash Scripting Guide.

在您的代码段中,没有任何区别,因为您没有使用任何其他功能.

bash脚本中 if 语句 和 for 语句的用法

bash脚本中 if 语句 和 for 语句的用法

在bash shell脚本中,我们要先了解三种执行顺序

顺序执行 (从左到右,从上到下的执行)

选择执行 (条件满足或者不满足的时候,才会执行某段结构)

循环执行 (重复执行某段结构)


今天所写的if 就是选择顺序,for就是循环执行

在if或者for中不可避免的要使用一些结构,还有一些运算方法,我先把这些列出来,方便以后使用。

算术运算方法

1.$[expression]

其中的表达式可以是纯数字组成的,也可以使用变量引用变量值;在使用变量时,可以将$符号省略;

示例:

# echo $[3+4]

# NUM1=5 ; NUM2=4 ; echo $[NUM1*NUM2]

2.let VAR=EXPRESSION

根据算术表达式完成算术运算并赋值给指定的变量;

3.$((EXPRESSION))

其中的表达式可以是纯数字组成的,也可以使用变量引用变量值;在使用变量时,可以将$符号省略;

4.expr ARGU1 ARGU2 ARGU3

其中ARGU1和ARGU3必须是整数数值;ARGU2是算术运算符;

5.echo "EXPRESSION" | bc

6.bc <<< EXPRESSION


位置参数变量
$0:命令的本身,对于脚本而言,就是该脚本的路径;
$1,$2.....$n:脚本后面通过命令行给脚本传递的命令行参数;
n>9时,引用该位置变量时,需要加{},即${10}

特殊变量:
$@:给出的所有位置参数的列表,当使用双引号引用时,每个参数作为单独的字符串存在;
$*:给出的所有位置参数的列表,当使用双引号引用时,整个参数列表被当做一个字符串;
$#:标识除去$0之外,整个命令行中有多少个参数;

shift命令,可以将$2->$1;


if语句:
if: if 命令; then 命令; [ elif 命令; then 命令; ]... [ else 命令; ] fi

if语句的单分支结构:
if 命令; then 命令; fi

注意:是否会执行then后面的命令,取决于if后面的命令的执行状态返回值;
1.如果其返回值为真,则执行then后面的命令;
2.如果其但回执为假,则不执行then后面的命令;


建议在脚本中的书写格式:
if CONDITION ; then
STATEMENT
..
fi


if CONDITION ;
then
STATEMENT
..
fi

if语句的双分支结构:
if 命令; then 命令; else 命令; fi

注意:是否会执行then或else后面的命令,取决于if后面的命令的执行状态返回值;
1.如果其返回值为真,则执行then后面的命令;
2.如果其但回执为假,则执行else后面的命令;


建议在脚本中的书写格式:
if CONDITION ; then
STATEMENT
..
else
STATEMENT
..
fi


if CONDITION ;
then
STATEMENT
..
else
STATEMENT
..
fi

if语句的多分支结构:(不建议使用,太麻烦,我们可以用下边的方法,进行单个或者多个的嵌套解决
if 命令; then 命令; [ elif 命令; then 命令; ]... [ else 命令; ] fi

注意:是否会执行then或else后面的命令,取决于if后面的命令的执行状态返回值或者elif后面的命令的执行状态返回值;
1.首先判断if后面的命令的状态返回值是否为真,如果为真,就执行then后面的语句;如果为假,就继续判断第一个elif后面的命令的执行状态返回值;
2.第一个elif后面的命令的执行状态返回值为真,就执行第一个elif语句中then后面的命令,否则,就继续判断第二个elif后面的命令执行状态返回值;
3.以此类推,会判断每个elif后面的命令的执行状态返回值是否为真,如果所有的if和elif后面的命令的执行状态返回值均为假,则执行else后面的语句;

建议在脚本中的书写格式:
if CONDITION ; then
STATEMENT
..
elif CONDITION2 ; then
STATEMENT
..
else ; then
STATEMENT
..
fi


if CONDITION ;
then
STATEMENT
..
elif CONDITION2 ; then
STATEMENT
..
else
STATEMENT
..
fi

注意:if的多分支结构,使用场景不多,而且有些时候,可以使用嵌套的单分支或双分支if结构代替if多分支结构;

嵌套的if结构

if CONTITIONG1 ; then
if CONTITIONG2 ; then
if CONTITIONG3 ; then
STATEMENT
..
else
STATEMENT
fi
else
STATEMENT
fi
else
STATEMENT
fi




一个好的循环结构,必须包括两个重要的环节;
1.进入循环的条件:
在符合要求或满足条件时才开始循环;

2.退出循环的条件:
达到某个要求或符合某个条件时需要结束或终止循环的执行;

for循环:
1.遍历列表的循环:
为列表中的每个成员执行命令。
for 名称 [in 词语 ... ] ; do 命令; done

建议在脚本中书写的格式:
for VAR_NAME in LIST ; do
循环体
done

for VAR_NAME in LIST
do
循环体
done

注意:
VAR_NAME:任意指定的变量名称,变量的值是从LIST中遍历获取的各个元素;
LIST:for循环需要遍历的列表;可以通过以下方式生成列表;
1.直接给出列表;
2.纯整数列表;
1)花括号展开:
{FirsTNUM..LASTNUM}
{FirsT,SECOND,THIRD,...,LAST}
2)seq命
seq [OPTION]... LAST
seq [OPTION]... FirsT LAST
seq [OPTION]... FirsT INCREMENT LAST
3.花括号展开:
{FirsT..LAST}
4.命令的执行结果:
ls /etc
5.GLOBBING通配符
6.某些特殊变量的值:
$*,$@
循环体:
一般来说,循环体中应该能够用到VAR_NAME变量的值的命令或命令的组合;如果循环体中的命令并没有用到VAR_NAME变量的值的话,列表的元素个数,就是此次for循环的次数;

1.进入循环的条件,LIST中尚有未被取尽的元素;
2.退出循环的条件,LIST中的元素被取尽;
3.for循环几乎不会出现死循环;
4.在执行循环的过程中,需要将整个LIST载入内存,因此。对于大列表来说,可能会消耗比较多的内存及cpu资源;




简单的例子(vim编辑内容)


1.传递一个字符串给脚本,脚本会将该字符串当作用户名,如果该用户不存在,则添加之并为其设置与用户名相同的密码。

#!/bin/bash
#
if[$#-ne1];then
echo"pleaseinputonenamecharast"
exit6;
fi
ifid$1&>/dev/null;then
echo"Thisuseralreadyexists"
else
useradd$1&>/dev/null
echo$1|passwd--stdin$1&>/dev/null
echo"Thisusercreatandpasswordisusername"
fi

2.将两个文本文件的路径传递给脚本作为其参数,如果有文件不存在,则结束脚本执行并报告错误信息;如果文件都存在,则比较两个文件中哪个文件的行数多,返回行数多的文件的文件名。

#!/bin/bash
#
read-p"Pleaseinputtwofiles:"FILE1FILE2
if!cat$FILE1&>/dev/null;then
echo"pleaseenterthefirsttruepathfile"
exit5
if!cat$FILE2&>/dev/null;then
echo"pleaseenterthesecondtruepathfile"
exit5
fi
fi
LINE1=$(cat$FILE1|wc-l)
LINE2=$(cat$FILE2|wc-l)
if[$LINE1-ne$LINE2];then
if[$LINE1-gt$LINE2];then
echo"$FILE1"
else
echo"$FILE2"
fi
else
echo"$FILE1and$FILE2aregenerallylong"
fi
unsetFILE1FILE2LINE1LINE2


3.利用RANDOM变量随机生成十个数字,显示出这十个数字,并显示出其中的最大值和最小值。

#!/bin/bash
#
touch/tmp/math.txt
forIin$(seq110);do
J=$RANDOM
echo"$J"
echo"$J">>/tmp/math.txt
done
K=$(sort-n/tmp/math.txt|head-1)
L=$(sort-n/tmp/math.txt|tail-1)
echo"laster$L;leaster$K"
rm-rf/tmp/math.txt
exit5



4.给脚本传递一个数字作为行总数,分别打印由*组成的最0小锐角朝上和朝下的等腰三角形以及菱形。

#!/bin/bash
#
read-p"enteronenumber:"INT
if[[$INT=~[^[:digit:]]]];then
echo"pleaseenterthenumber"
exit5
fi
echo”zhengsanjiao“
forIin$(seq$INT);do
forJin$(seq$[INT-I]);do
echo-n""
done
forKin$(seq$[2*I-1]);do
echo-n"*"
done
echo
done
echo"daosanjiao"
forMin$(seq$INT);do
forBin$(seq$[M-1]);do
echo-n""
done
forNin$(seq$[2*(INT-M)+1]);do
echo-n"*"
done
echo
done
echo"lingxing"
if[$[INT%2]-ne0];then
INT2=$[(INT+1)/2]
forQin$(seq$INT2);do
forWin$(seq$[INT2-Q]);do
echo-n""
done
forEin$(seq$[2*Q-1]);do
echo-n"*"
done
echo
done
forRin$(seq$[INT2-1]);do
forTin$(seq$[R]);do
echo-n""
done
forYin$(seq$[2*(INT2-R)-1]);do
echo-n"*"
done
echo
done
exit7
else
echo"qingshurujishu>3"
fi

5.分别打印顺序和旋转的九九乘法表。
顺序的九九乘法表是正常的九九乘法表;
旋转的九九乘法表是第一行是1×1=1 1×2=2 1×3=3 1×4=4 ... 1×9=9; 第二行是2×2=4 2×3=6 2×4=8 ... 2×9=18; ... 第九行是9×9=81;

#!/bin/bash
#
forIin$(seq19);do
forJin$(seq1$I);do
echo-ne"$I×$J=$[I*J]\t"
done
echo
done
forMin$(seq19);do
forNin$(seq$M9);do
echo-ne"$M×$N=$[N*M]\t"
done
echo
done

bash脚本中case语句中的模式

bash脚本中case语句中的模式

man页面说case语句使用“文件名扩展模式匹配”。
我通常希望有一些参数的短名称,所以我去:
case $1 in
    req|reqs|requirements) TASK="Functional Requirements";;
    met|meet|meetings) TASK="Meetings with the client";;
esac

logTimeSpentIn "$TASK"

我试图模式像req *或我{e,} t,我理解会正确扩展以匹配文件扩展的上下文中的值,但它不工作。

大括号扩展不工作,但*,?和[]做。如果你设置shopt -s extglob然后你还可以使用:

>?() – 零或一次出现的模式
> *() – 零个或多个模式出现
>() – 一次或多次出现模式
> @() – 一次出现模式
>!() – 除了模式之外的任何东西

这里有一个例子:

case $1 in
    a*           ) foo;;    # matches anything starting with "a"
    b?           ) bar;;    # matches any two-character string starting with "b"
    c[de]        ) baz;;    # matches "cd" or "ce"
    me?(e)t      ) qux;;    # matches "met" or "meet"
    @(a|e|i|o|u) ) fuzz;;   # matches one vowel
esac

我们今天的关于macos – 使bash脚本显示系统事件对话框,然后获取其结果并在if语句中使用它的分享已经告一段落,感谢您的关注,如果您想了解更多关于Bash if语句中带有变量的空格、Bash脚本if语句、bash脚本中 if 语句 和 for 语句的用法、bash脚本中case语句中的模式的相关信息,请在本站查询。

本文标签: