在 Bash 脚本中将字符串内容放在引号中是否重要?考虑以下两个变量:
str1=hei
str2="Hi"
Run Code Online (Sandbox Code Playgroud)
bash 中首选上述哪种定义字符串文字的方法?为什么?
我正在创建一个 bash 脚本来通过Azure CLI预配多个 Azure 资源。到目前为止一切顺利,但是我在标记资源时遇到问题。
az我的目标是将多个标签存储在一个变量中,并将该变量提供给脚本中多个命令的 --tags 选项。然而问题是值中的空格将被解释为新键。
如果我们以命令az group update(将更新资源组)为例,文档对 --tags 选项进行了以下说明:
--tags'key[=value]' 格式的空格分隔标签。使用“”清除现有标签。
当值(或键)包含空格时,必须将其括在引号中。因此,当我们直接向命令提供键值对(包括带空格的值)时(如下例所示),结果将符合预期:
az group update --tags owner="FirstName LastName" application=coolapp --name resource-group-name
Run Code Online (Sandbox Code Playgroud)
结果将是两个标签已添加到资源组中:
{
"id": "/subscriptions/1e42c44c-bc55-4b8a-b35e-de1dfbcfe481/resourceGroups/resource-group-name",
"location": "westeurope",
"managedBy": null,
"name": "resource-group-name",
"properties": {
"provisioningState": "Succeeded"
},
"tags": {
"application": "coolapp",
"owner": "FirstName LastName"
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我们将上一步中使用的相同值存储在变量中时,就会出现问题。
tag='owner="FirstName LastName" application=coolapp'
Run Code Online (Sandbox Code Playgroud)
我用来echo $tag验证变量是否包含与我们在上一个示例中为 --tags 选项提供的值完全相同的值:
owner="FirstName LastName" application=coolapp
Run Code Online (Sandbox Code Playgroud)
但是,当我们将此标签变量提供给命令的标签选项时,如下一行所示:
az group update --tags $tag --name resource-group-name
Run Code Online (Sandbox Code Playgroud)
结果将是三个标签,而不是预期的两个: …
我想将CPD(复制粘贴检测)集成到我的iOS项目中.我在这里和这里读到了它.
要在代码中自动确定CopyPaste,我正在使用bash脚本:
echo "Checking files in ${SOURCE_ROOT}"
JARS_DIR=${PROJECT_DIR}/CPD
FULL_PATH_TO_CPD_XML_OUTPUT=${PROJECT_DIR}/cpd-output.xml
# Running CPD
java -classpath "${JARS_DIR}/ObjCLanguage-0.0.5-SNAPSHOT.jar:${JARS_DIR}/pmd.jar" net.sourceforge.pmd.cpd.CPD --minimum-tokens 100 --files "${SOURCE_ROOT}" -v --language ObjectiveC --encoding UTF-8 --format net.sourceforge.pmd.cpd.XMLRenderer > "${FULL_PATH_TO_CPD_XML_OUTPUT}"
# Running self :)
${BUILT_PRODUCTS_DIR} -cpd-xml "${FULL_PATH_TO_CPD_XML_OUTPUT}"
Run Code Online (Sandbox Code Playgroud)
该代码创建了cpd-output.xml文件.但是在编译时带错了"Command/bin/sh失败,退出代码为126".这是日志副本http://pastebin.com/359k1Wni 我从这个示例项目中获取了代码 错误然后我评论此字符串:
${BUILT_PRODUCTS_DIR} -cpd-xml "${FULL_PATH_TO_CPD_XML_OUTPUT}"
Run Code Online (Sandbox Code Playgroud)
我试图找到有关此错误的信息,但发现只有少数这些问题没有答案.我对bash脚本没什么了解.任何建议我都会很满意.感谢您的关注.
PS作者遵循写的脚本:
为了集成XCode和CPD,我们将使用项目Run Script阶段添加Build Phases目标,该阶段通常由几个部分组成:实际调用cpd解析cpd-output.xml以"正确的格式"输出
我正在使用此脚本定期将postgresql的旧私有实例备份到gmail:
#!/bin/bash
/opt/local/lib/postgresql83/bin/pg_dump maxgests -U postgres | gzip --best -c > $1 && (/opt/local/bin/mutt -s `date "+%d-%m-%Y-%H:%M"` -a $1 $2 < /dev/null)
Run Code Online (Sandbox Code Playgroud)
最近我得到了这个:
./postgres_to_gmail.sh: line 2: $1: ambiguous redirect
Run Code Online (Sandbox Code Playgroud)
脚本不再有效.Mac OS X 10.6.8.
anytone可以告诉我什么是错的以及如何解决它?
第一个参数是路径,就像 /tmp/database.gz
第二个参数是电子邮件.
我已修改此脚本以从YouTube下载歌曲但我在运行时遇到以下错误:
sh youtube2mp3.sh https://www.youtube.com/watch?v=gpOJ6iu8fqQ
Run Code Online (Sandbox Code Playgroud)
错误:
youtube2mp3.sh: line 31: [: too many arguments
youtube2mp3.sh: line 39: [: too many arguments
youtube2mp3.sh: line 49: [: too many arguments
Sorry but the system encountered a problem.
Run Code Online (Sandbox Code Playgroud)
行号指的是if [ -f $video_title.$ext1 ]三行......我认为我的论点没有,因为它在以前的版本中有效,但我仍然坚持这一点 - 有人可以解释我需要做些什么来纠正它吗?
address=$1
video_title="$(python youtube-dl $address)"
ext1="flv"
ext2="mp4"
ext3="webm"
if [ -f $video_title.$ext1 ]
then
ffmpeg -i $video_title.$ext1 "$video_title".wav
lame "$video_title".wav "$video_title".mp3
rm $video_title.$ext1 "$video_title".wav
else
if [ -f $video_title.$ext2 ]
then
ffmpeg -i $video_title.$ext2 "$video_title".wav
lame "$video_title".wav "$video_title".mp3
rm …Run Code Online (Sandbox Code Playgroud) 我有四个文件:
one_file.txt
abc | def
Run Code Online (Sandbox Code Playgroud)
two_file.txt
ghi | jkl
Run Code Online (Sandbox Code Playgroud)
three_file.txt
mno | pqr
Run Code Online (Sandbox Code Playgroud)
four_WORD.txt
xyz| xyz
Run Code Online (Sandbox Code Playgroud)
我想连接所有以"file.txt"结尾的文件(即除了four_WORD.txt之外的所有文件)以获得:
abc | def
ghi | jkl
mno | pqr
Run Code Online (Sandbox Code Playgroud)
为此,我运行:
cat*file.txt> full_set.txt
但是,full_set.txt表示为:
abc | defmno | pqrghi | jkl
Run Code Online (Sandbox Code Playgroud)
任何想法如何正确有效地做到这一点,以便每个人最终都在自己的路线上?实际上,我需要对很多非常大的文件执行上述操作.预先感谢您的帮助.
#!/usr/bin/env python
# encoding: utf-8
import re
import subprocess
import time
import json
def get_temperatures(disks):
sensors = subprocess.check_output(["sensors"])
temperatures = {match[0]: float(match[1]) for match in re.findall("^(.*?)\:\s+\+?(.*?)°C",
sensors, re.MULTILINE)}
for disk in disks:
output = subprocess.check_output(["smartctl", "-A", disk])
temperatures[disk] = int(re.search("Temperature.*\s(\d+)\s*(?:\([\d\s]*\)|)$",
output, re.MULTILINE).group(1))
return temperatures
def main():
while True:
print json.dumps(get_temperatures(("/dev/sda2", "/dev/sdb1")))
time.sleep(20)
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
这是使用smartmontools和lm-sensors监控Python温度的小脚本.但是,当我尝试运行它时,我有一个错误
subprocess.CalledProcessError: Command '['smartctl', '-A', '/dev/sda2']' returned non-zero exit status 2
Run Code Online (Sandbox Code Playgroud)
但是当我在终端中手动尝试此命令时,它们工作得很好.
一些信息:
uname -a
Run Code Online (Sandbox Code Playgroud)
Linux LME 4.0.0-040000-generic#201504121935 SMP Sun Apr 12 23:36:33 …
我总是使用$@当我想要bash函数的所有参数但最近我发现它$*也以相同的方式工作,它也可以用作数组索引.
我的问题是有什么区别$*的$@Bash中?我应该选择哪一个?
你好,我有一个像这样的 shell 命令。
s3=$(awk 'BEGIN{ print "S3 bucket path" }
/Executing command\(queryId/{ sub(/.*queryId=[^[:space:]]+: /,""); q=$0 }
/s3:\/\//{ print "," $10 }' OFS=',' hive-server2.log)
Run Code Online (Sandbox Code Playgroud)
上面命令的输出是这样的。
echo $s3
2018-02-21T17:58:22,
2018-02-21T17:58:26,
2018-02-21T18:05:33,
2018-02-21T18:05:34
Run Code Online (Sandbox Code Playgroud)
我只想选择最后一行。我需要这样的最后一个输出。
2018-02-21T18:05:34
Run Code Online (Sandbox Code Playgroud)
我这样尝试过。
awk -v $s3 '{print $(NF)}'
Run Code Online (Sandbox Code Playgroud)
不起作用。任何帮助将不胜感激。
我知道如何遍历目录中的所有文件,例如:
for i in *
do
<some command>
done
Run Code Online (Sandbox Code Playgroud)
但是我想查看目录中的所有文件,包括(特别是!)子目录中的所有文件。有没有一种简单的方法可以做到这一点?