相关疑难解决方法(0)

bash 字符串带引号和不带引号有什么区别

在 Bash 脚本中将字符串内容放在引号中是否重要?考虑以下两个变量:

str1=hei
str2="Hi"
Run Code Online (Sandbox Code Playgroud)

bash 中首选上述哪种定义字符串文字的方法?为什么?

string bash

7
推荐指数
1
解决办法
2138
查看次数

空格分隔值;如何提供包含空格的值

我正在创建一个 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)

结果将是三个标签,而不是预期的两个: …

bash tagging azure azure-cli azure-resource-group

7
推荐指数
1
解决办法
4020
查看次数

bash脚本出错"退出代码126"

我想将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以"正确的格式"输出

java bash xcode objective-c ios

6
推荐指数
3
解决办法
5万
查看次数

解决$ 1:模糊重定向

我正在使用此脚本定期将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

第二个参数是电子邮件.

bash

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

bash脚本中的参数错误太多

我已修改此脚本以从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)

bash shell

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

如何让猫开始新的一线

我有四个文件:

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)

任何想法如何正确有效地做到这一点,以便每个人最终都在自己的路线上?实际上,我需要对很多非常大的文件执行上述操作.预先感谢您的帮助.

unix bash

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

Python subprocess.CalledProcessError:返回非零退出状态2

#!/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 …

python linux

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

Bash中`$*`和`$ @`有什么区别?

我总是使用$@当我想要bash函数的所有参数但最近我发现它$*也以相同的方式工作,它也可以用作数组索引.

我的问题是有什么区别$*$@Bash中?我应该选择哪一个?

arrays parameters bash

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

如何选择shell输出的最后一行

你好,我有一个像这样的 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)

不起作用。任何帮助将不胜感激。

bash shell awk sed

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

使用 Bash 遍历目录和子目录中的所有文件

我知道如何遍历目录中的所有文件,例如:

for i in *
do
  <some command>
done
Run Code Online (Sandbox Code Playgroud)

但是我想查看目录中的所有文件,包括(特别是!)子目录中的所有文件。有没有一种简单的方法可以做到这一点?

bash

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