我正在编写一个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中的函数?
我有一个问题,将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延续线?
我意识到你可以这样做:
echo "continuation \
lines"
>continuation lines
Run Code Online (Sandbox Code Playgroud)
但是,如果你有缩进代码,它不能很好地工作:
echo "continuation \
lines"
>continuation lines
Run Code Online (Sandbox Code Playgroud) 我一直在寻找一个解决方案并找到类似的问题,只是他们试图在它们之间用空格分割句子,而答案对我的情况不起作用.
目前一个变量被设置为像这样的字符串:
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.
我正在尝试使用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脚本,它构建一个字符串以作为命令运行
脚本:
#! /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) 例如.
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"?
wc -l file.txt
Run Code Online (Sandbox Code Playgroud)
输出行数和文件名.
我只需要数字本身(不是文件名).
我可以做这个
wc -l file.txt | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)
但也许有更好的方法?
在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脚本中有这个.
我正在编写一个脚本来自动为我自己的web服务器创建Apache和PHP的配置文件.我不想使用像CPanel或ISPConfig这样的任何GUI.
我有一些Apache和PHP配置文件的模板.Bash脚本需要读取模板,进行变量替换并将解析后的模板输出到某个文件夹中.最好的方法是什么?我可以想到几种方法.哪一个是最好的还是有更好的方法可以做到这一点?我想在纯Bash中做到这一点(例如在PHP中很容易)
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)
对我来说似乎不好,因为需要逃避许多不同的符号,并且对于许多变量,这条线太长了.
你能想到其他一些优雅而安全的解决方案吗?