标签: whitespace

为什么我的 shell 脚本会因空格或其他特殊字符而阻塞?

或者,有关强大的文件名处理和在 shell 脚本中传递的其他字符串的介绍性指南。

我写了一个 shell 脚本,它在大多数情况下运行良好。但它在某些输入(例如某些文件名)上窒息。

我遇到了如下问题:

  • 我有一个包含空格的文件名hello world,它被视为两个单独的文件helloworld.
  • 我有一个带有两个连续空格的输入行,它们在输入中缩小为一个。
  • 前导和尾随空格从输入行中消失。
  • 有时,当输入包含其中一个字符时\[*?,它们会被一些文本替换,这实际上是文件的名称。
  • 输入中有一个撇号'(或双引号"),在那之后事情变得很奇怪。
  • 输入中有一个反斜杠(或者:我使用的是 Cygwin 并且我的一些文件名具有 Windows 样式的\分隔符)。

这是怎么回事,我该如何解决?

shell bash shell-script quoting whitespace

341
推荐指数
3
解决办法
32万
查看次数

如何从某些输出的每一行中修剪前导和尾随空格?

我想从输出的每一行中删除所有前导和尾随空格和制表符。

有没有一个简单的工具,比如trim我可以将我的输出输入到其中?

示例文件:

test space at back 
 test space at front
TAB at end  
    TAB at front
sequence of some    space in the middle
some empty lines with differing TABS and spaces:





 test space at both ends 
Run Code Online (Sandbox Code Playgroud)

pipe shell-script text-processing whitespace

265
推荐指数
10
解决办法
52万
查看次数

为什么 Vim 会错误地缩进粘贴的代码?

在 Vim 中,如果我粘贴此脚本:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"
Run Code Online (Sandbox Code Playgroud)

我得到了这些奇怪的结果:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       
Run Code Online (Sandbox Code Playgroud)

哈希符号 (#) 和制表符已出现。为什么?

vim clipboard whitespace

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

为什么 bash 不存储以空格开头的命令?

如果我执行一系列命令,例如:

$ ls
$ grep abc file.txt
Run Code Online (Sandbox Code Playgroud)

然后使用向上箭头键获取上一个,终端将显示最后一个cmd(这是grep这里)

但如果我做这样的事情:

$ ls
$   grep abc file.txt
Run Code Online (Sandbox Code Playgroud)

wheregrep前面有空格,向上按给出ls,而不是grep

为什么是这样?

bash command-history whitespace

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

从变量中删除所有空格、制表符、换行符等?

这是我得到的错误,它失败是因为一个变量的值应该是 2(我使用 a 得到这个select * from tabel)。我在那个变量中得到了空格。

+ 0 != 
         2
./setjobs[19]: 0:  not found.
Run Code Online (Sandbox Code Playgroud)

如何从该变量中删除所有这些空格或换行符?可以tr,,sed或任何帮助?

这就是我正在做的:

set_jobs_count=$(echo  "set heading off;
      select count(*) from oppar_db
      where ( oppar_db_job_name, oppar_db_job_rec ) in ($var) ;" | \
  sqlplus -s ${OP_ORA_USER}/${OP_ORA_PASS}@$OPERATIONAL_DB_NAME)
Run Code Online (Sandbox Code Playgroud)

这按建议工作:

| sed 's/[[:space:]]//g'
Run Code Online (Sandbox Code Playgroud)

但我仍然获得一个值,如:

  set_jobs_count=
  2
Run Code Online (Sandbox Code Playgroud)

shell sed whitespace tr newlines

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

忽略所有 git 命令中的空格更改

我找到了大量网站,它们解释了如何在更改行尾时让 git 警告您,或者使用其他各种技术来防止您弄乱整个文件。假设现在为时已晚——树已经有切换文件行尾的提交,因此git diff显示旧文件的减法,然后添加具有相同内容的新文件

我正在寻找一个 git 配置选项或命令行标志,它告诉diff忽略那些 - 如果两行只有空格不同,假装它们是相同的。我需要这个配置选项/标志工作任何依赖文件的差异- diffblame甚至merge/rebase理想-我想git完全忽略尾随的空白,尤其是行尾。我怎样才能做到这一点?

configuration git whitespace

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

如何在 Vi 和 Vim 中保存时自动去除尾随空格?

.vimrc保存文件时是否有自动删除尾随空格的设置?

理想情况下(为了安全起见)我只想对某些文件使用此功能,例如 *.rb

vim editors vi vimrc whitespace

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

if 条件中的括号:为什么我会收到没有空格的语法错误?

当脚本在一年的开始两天运行时,我使用下面的脚本将两天后移,并检查每个月的第一天和第二天,然后将后移两天。

if [$month="01"] && [$day="01"]; then
        date="$last_month/$yes_day/$last_year"
        fulldate="$last_month/$yes_day/$last_year"
else
        if [$month="01"] && [$day="02"]; then
                date="$last_month/$yes_day/$last_year"
                fulldate="$last_month/$yes_day/$last_year"
        else
                if [ $day = "01" ]; then
                        date="$last_month/$yes_day/$year"
                        fulldate="$year$last_month$yes_day"
                else
                        if [ $day = "02" ]; then
                                date="$last_month/$yes_day/$year"
                                fulldate="$year$last_month$yes_day"
                        else
                                date="$month/$yes_day/$year"
                                fulldate="$year$month$yes_day"
                        fi
                fi
        fi
fi
Run Code Online (Sandbox Code Playgroud)

但我的坏消息是收到以下错误消息

Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found
Run Code Online (Sandbox Code Playgroud)

shell bash shell-script whitespace test

18
推荐指数
2
解决办法
7709
查看次数

处理可能带有空格的文件名列表的 POSIX 兼容方式

我已经看到 Bash 脚本指南建议使用数组来处理包含空格的文件名。然而,DashAsBinSh表明数组不可移植,所以我正在寻找一种符合 POSIX 的方式来处理可能包含空格的文件名列表。

我正在寻找修改下面的示例脚本,以便它 echo

foo/target/a.jar
foo/target/b.jar
bar/target/lol whitespace.jar
Run Code Online (Sandbox Code Playgroud)

这是脚本

#!/usr/bin/env sh

INPUT="foo/target/a.jar
foo/target/b.jar
bar/target/b.jar
bar/target/lol whitespace.jar"
# this would be produced by a 'ls' command
# We can execute the ls within the script, if it helps

dostuffwith() { echo $1; };

F_LOCATIONS=$INPUT
ALL_FILES=$(for f in $F_LOCATIONS; do echo `basename $f`; done)
ALL_FILES=$(echo "$ALL_FILES" | sort | uniq)

for f in $ALL_FILES
do
    fpath=$(echo "$F_LOCATIONS" | grep -m1 $f)
    dostuffwith $fpath
done
Run Code Online (Sandbox Code Playgroud)

shell-script filenames posix quoting whitespace

16
推荐指数
2
解决办法
5483
查看次数

为什么 bash 有 HISTCONTROL=ignorespace 选项?

或者换一种说法,你为什么要阻止命令被写入 bash 历史记录?

(受到一个相关问题的启发。)

bash command-history whitespace

15
推荐指数
2
解决办法
6660
查看次数