相关疑难解决方法(0)

在bash中传递带空格的字符串作为函数参数

我正在编写一个bash脚本,我需要将包含空格的字符串传递给我的bash脚本中的函数.

例如:

#!/bin/bash

myFunction
{
    echo $1
    echo $2
    echo $3
}

myFunction "firstString" "second string with spaces" "thirdString"
Run Code Online (Sandbox Code Playgroud)

运行时,我期望的输出是:

firstString
second string with spaces
thirdString
Run Code Online (Sandbox Code Playgroud)

但是,实际输出的是:

firstString
second
string
Run Code Online (Sandbox Code Playgroud)

有没有办法将带空格的字符串作为单个参数传递给bash中的函数?

bash function

153
推荐指数
5
解决办法
19万
查看次数

如何将Bash命令的输出分配给变量?

我有一个问题,将pwd命令的内容放入shell变量中,稍后我将使用它.

这是我的shell代码(循环不会停止):

#!/bin/bash
pwd= `pwd`
until [ $pwd = "/" ]
    do
        echo $pwd
        ls && cd .. && ls 
        $pwd= `pwd` 
    done
Run Code Online (Sandbox Code Playgroud)

你能发现我的错误吗?

bash shell

153
推荐指数
4
解决办法
28万
查看次数

Bash延续线

你如何使用bash延续线?

我意识到你可以这样做:

echo "continuation \
lines"
>continuation lines
Run Code Online (Sandbox Code Playgroud)

但是,如果你有缩进代码,它不能很好地工作:

    echo "continuation \
    lines"
>continuation     lines
Run Code Online (Sandbox Code Playgroud)

bash indentation line

143
推荐指数
4
解决办法
15万
查看次数

如何在bash shell中将一个字符串拆分为多个变量?

我一直在寻找一个解决方案并找到类似的问题,只是他们试图在它们之间用空格分割句子,而答案对我的情况不起作用.

目前一个变量被设置为像这样的字符串:
ABCDE-123456
我想将它分成2个变量,同时消除" - ".即:
var1=ABCDE
var2=123456

怎么可能做到这一点?


这是对我有用的解决方案:
var1=$(echo $STR | cut -f1 -d-)
var2=$(echo $STR | cut -f2 -d-)

是否可以使用cut命令在没有分隔符的情况下工作(每个字符都设置为变量)?

var1=$(echo $STR | cut -f1 -d?)
var2=$(echo $STR | cut -f1 -d?)
var3=$(echo $STR | cut -f1 -d?)
etc.

variables bash shell

141
推荐指数
5
解决办法
32万
查看次数

如何获取shell脚本中目录中的文件列表?

我正在尝试使用shell脚本获取目录的内容.

我的脚本是:

for entry in `ls $search_dir`; do
    echo $entry
done
Run Code Online (Sandbox Code Playgroud)

哪里$search_dir是相对路径.但是,它$search_dir包含许多名称中带有空格的文件.在这种情况下,此脚本不会按预期运行.

我知道我可以使用for entry in *,但这只适用于我当前的目录.

我知道我可以更改到该目录,for entry in *然后使用然后更改回来,但我的特殊情况阻止我这样做.

我有两个相对路径$search_dir$work_dir,和我有两个同时工作,阅读他们创建/删除在他们的文件等.

那我现在该怎么办?

PS:我用bash.

bash shell directory-listing

134
推荐指数
7
解决办法
44万
查看次数

在Bash脚本中将字符串作为命令运行

我有一个Bash脚本,它构建一个字符串以作为命令运行

脚本:

#! /bin/bash

matchdir="/home/joao/robocup/runner_workdir/matches/testmatch/"

teamAComm="`pwd`/a.sh"
teamBComm="`pwd`/b.sh"
include="`pwd`/server_official.conf"
serverbin='/usr/local/bin/rcssserver'

cd $matchdir
illcommando="$serverbin include='$include' server::team_l_start = '${teamAComm}' server::team_r_start = '${teamBComm}' CSVSaver::save='true' CSVSaver::filename = 'out.csv'"

echo "running: $illcommando"
# $illcommando > server-output.log 2> server-error.log
$illcommando
Run Code Online (Sandbox Code Playgroud)

这似乎没有正确地提供参数$serverbin.

脚本输出:

running: /usr/local/bin/rcssserver include='/home/joao/robocup/runner_workdir/server_official.conf' server::team_l_start = '/home/joao/robocup/runner_workdir/a.sh' server::team_r_start = '/home/joao/robocup/runner_workdir/b.sh' CSVSaver::save='true' CSVSaver::filename = 'out.csv'
rcssserver-14.0.1

Copyright (C) 1995, 1996, 1997, 1998, 1999 Electrotechnical Laboratory.
2000 - 2009 RoboCup Soccer Simulator Maintenance Group.


Usage: /usr/local/bin/rcssserver [[-[-]]namespace::option=value]
                                 [[-[-]][namespace::]help]
                                 [[-[-]]include=file]
Options:
    help
        display generic help

    include=file
        parse …
Run Code Online (Sandbox Code Playgroud)

bash shell command-line-arguments

133
推荐指数
4
解决办法
33万
查看次数

如何在bash中转义通配符/星号字符?

例如.

me$ FOO="BAR * BAR"
me$ echo $FOO
BAR file1 file2 file3 file4 BAR
Run Code Online (Sandbox Code Playgroud)

并使用"\"转义字符:

me$ FOO="BAR \* BAR"
me$ echo $FOO
BAR \* BAR
Run Code Online (Sandbox Code Playgroud)

我显然做了一些愚蠢的事.

如何获得输出"BAR*BAR"?

bash shell escaping

128
推荐指数
4
解决办法
10万
查看次数

如何让"wc -l"只打印没有文件名的行数?

wc -l file.txt
Run Code Online (Sandbox Code Playgroud)

输出行数和文件名.

我只需要数字本身(不是文件名).

我可以做这个

 wc -l file.txt | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

但也许有更好的方法?

shell wc

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

Bash函数可以找到最新的文件匹配模式

在Bash中,我想创建一个函数,该函数返回与特定模式匹配的最新文件的文件名.例如,我有一个文件目录,如:

Directory/
   a1.1_5_1
   a1.2_1_4
   b2.1_0
   b2.2_3_4
   b2.3_2_0
Run Code Online (Sandbox Code Playgroud)

我想要以'b2'开头的最新文件.我怎么在bash中这样做?我需要在我的~/.bash_profile脚本中有这个.

linux bash

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

Bash Templating:如何使用Bash从模板构建配置文件?

我正在编写一个脚本来自动为我自己的web服务器创建Apache和PHP的配置文件.我不想使用像CPanel或ISPConfig这样的任何GUI.

我有一些Apache和PHP配置文件的模板.Bash脚本需要读取模板,进行变量替换并将解析后的模板输出到某个文件夹中.最好的方法是什么?我可以想到几种方法.哪一个是最好的还是有更好的方法可以做到这一点?我想在纯Bash中做到这一点(例如在PHP中很容易)

1)如何在文本文件中替换$ {}占位符?

template.txt:

the number is ${i}
the word is ${word}
Run Code Online (Sandbox Code Playgroud)

script.sh:

#!/bin/sh

#set variables
i=1
word="dog"
#read in template one line at the time, and replace variables
#(more natural (and efficient) way, thanks to Jonathan Leffler)
while read line
do
    eval echo "$line"
done < "./template.txt"
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如何在此处将输出重定向到外部文件?如果变量包含引号,我是否需要逃避某些事情?

2)使用cat&sed替换每个变量的值:

给出template.txt:

The number is ${i}
The word is ${word}
Run Code Online (Sandbox Code Playgroud)

命令:

cat template.txt | sed -e "s/\${i}/1/" | sed -e "s/\${word}/dog/"
Run Code Online (Sandbox Code Playgroud)

对我来说似乎不好,因为需要逃避许多不同的符号,并且对于许多变量,这条线太长了.

你能想到其他一些优雅而安全的解决方案吗?

bash templates templating

118
推荐指数
15
解决办法
10万
查看次数