问题标签 [ifs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bash - 使用带有 curl 的内部字段分隔符
当我做...
...我得到了我期望的输出。
当我做...
... 我不。
我误解了内部字段分隔符吗?如何在不使用任何空格字符的情况下运行 curl 命令?
c - C: IFS System() 漏洞
出于教育原因,我必须利用 C 代码
Programm先设置egid,再用system("/usr/bin/...");
Command设置漏洞。
所以我在我的主目录中创建了一个“usr”可执行文件并将路径设置为主目录PATH=$HOME:$PATH
我想将bash中的IFS变量更改为/:export IFS='/'
不幸的是,当我调用 C 程序时:我的漏洞利用不起作用
有人能告诉我出了什么问题吗?
bash - bash IFS 在这个例子中是如何工作的?
我正在阅读有关bash 内部变量的信息,并遇到了以下IFS
示例:
情况1
案例2
现在,根据我的理解,如果值IFS
是默认值,那么\t\n
前导和尾随空格将被删除。因此,对于 case1 bash var
,a b c
因此输出。
根据我的说法,对于 case2,bash 将var
其视为此处的|a||b|c|||
处理|
方式。space
我检查了它使用
所以,我对案例 2 的预期输出是
那么,有人可以在内部向我解释 bashvar
在案例 2 中的处理方式以及我的理解哪里出错了。
shell - 从 bash 脚本中的命令捕获数组数据时使用内部字段分隔符
当我运行命令时
在我的 git 存储库中,我得到了表单的提交列表
这是一件好事。
我现在想从 bash 脚本中执行此命令,并使用以下代码将输出捕获到数组中:
产生以下输出:
这不是一件好事
我的提交列表作为一个字符串返回,我必须先分解它才能使用它。经过一番搜索,我发现如果我IFS=""
在捕获数据之前添加到我的脚本中,我的问题就会得到解决。
所以我编辑了我的代码来阅读
哪个输出
这完全结束了我的现实感。
我想知道为什么事情正在做他们正在做的事情,所以经过更多搜索后,我发现这被称为 the Internal Field Separator
,命令解释器在 Unix 系统上使用它来确定将模式分解为标记的位置。
这个我明白。
我不明白的是
- 为什么将此变量设置为空字符串允许它以理智的方式处理我的数组数据。
- 为什么我必须首先设置它,而不是解释器意识到它正在处理数组数据并适当地处理它。
- 将内部字段分隔符设置为空字符串会产生什么影响,因为默认情况下它包含空格、制表符和换行符的字符。
一些帮助我理解这三点将不胜感激。
newline - 如何将 IFS 与 upstart 脚本一起使用?
我想将新贵预启动脚本中的 IFS 变量设置为换行符,但 IFS=$'\12' 不起作用。如何在此处设置 IFS 变量 - 我之前在此脚本中使用 export LC_ALL="en_US.UTF-8"
我在使用普通 bash 脚本并像之前提到的那样设置 IFS 时对其进行了测试,但在使用 upstart 时不起作用。
arrays - 使用变量在 bash 中传递 grep 模式
我正在努力传递变量中包含的几个 grep 模式。这是我的代码:
这就是我想要它做的事情:
- 确定/定义 grep 的位置
- 分配一个变量 (GREP_MY_OPTIONS) 保存我将传递给 grep 的参数
- 将几个模式分配给 GREP_MY_OPTIONS
- 使用 grep 和我存储在 $GREP_MY_OPTIONS 中的模式搜索包含空格的路径中的多个文件并将它们保存在数组中
当我使用“echo $GREP_MY_OPTIONS”时,它正在生成我所期望的,但是当我运行脚本时它失败并出现以下错误:
/bin/grep: 无效选项 -- ' '
我究竟做错了什么?如果路径中没有空格,一切似乎都可以正常工作,所以我认为这与 IFS 有关,但我不确定。
perl - 这个 bash 脚本如何导致无限循环?
通过一些谷歌搜索(无论如何我都不是 bash 专家),我能够编写一个 bash 脚本,它允许我运行一个测试套件并在它运行时在底部输出一个状态栏。通常需要大约 10 个小时,状态栏会告诉我有多少测试通过,多少失败。
有时它工作得很好,但偶尔我会遇到一个无限循环,这很糟糕(mmm-kay?)。这是我正在使用的代码:
当我遇到这个错误时会发生什么,我将有一个错误消息无限重复,导致日志文件 ( out.txt
) 变成一些数兆字节的怪物(我认为它进入了 GB 一次)。这是一个重复的示例错误(每组之间有四行空白):
我尝试取消2>&1
重定向,并尝试更改while IFS=read -r line;
为while read -r line;
,但我不断进入无限循环。奇怪的是,这似乎在大多数情况下都会发生,但有时我完成了长长的测试套件而没有任何问题。
编辑:
我写这篇文章的原因是从黑白测试套件升级到彩色测试套件(因此是 ANSI 代码)。以前,我会使用
以这种方式运行它会从 Perl 获得相同的警告,但会将其打印到文件中并继续前进,而不是陷入无限循环。使用 watch,也会打印类似的东西,[32m
而不是实际将文本渲染为绿色。
linux - 我们什么时候应该将 IFS 变量改回脚本中的原始值?
假设我通过 cronjob 执行此脚本:
它工作正常而不会引起任何问题。但是当我在终端中运行它时,我必须将IFS
变量设置回其原始值
一般在哪些情况下我们应该设置IFS
回原来的值?
bash - 传递给命令行参数时如何在 Bash 中转义变量
我有一个 Bash 脚本(Cygwin),它使用了一些带有空格的 Windows 路径。因此,我\
在变量定义中使用 a 转义了空间。
脚本中的所有内容都可以正常工作。但是,我需要将此变量作为参数传递给命令行可执行文件。当我这样做时,我的逃跑会变得一团糟。
示例非功能性脚本:
脚本的输出:
因此,如您所见,路径中的转义空间没有被导出到 $args 变量中。我假设错误出现在“args = ...”行上。但我不确定如何转义 $destinationPath 以确保保留转义字符。
我尝试在destinationPath 中使用双引号(没有转义空格),但无济于事。如果我尝试在 args= 行中使用双引号 $destinationPath,那么输出也会被一堆额外的引号搞砸。
我怎样才能让它工作?我尝试过使用 $IFS 变量,但我真的不知道我在用它做什么,似乎也无法让它与它一起工作,尽管我怀疑该解决方案与 $国际金融服务协会。
arrays - 在bash中将文本行拆分为数组
我有一堆名为jtn216_<n>.o<m>
wheren
和m
是整数的文件。第一个是我分配的,第二个是系统分配的。我需要检查每个文件的最后一行。我运行它以将该行拆分为数组
3499200 3499200 87650.5574975270 13.6931802555886
1014400 1014400 87947.4382620423 13.9208064005841 3475800 3475800 87779.1695691355 13.8939964916376 3479200 3479200 87459.7284508034 13.7824644675699 3827800 3827800
87868.7538056652 13.8792123626210 2551600 2551600 87615.6417285010 13.8700006744178 3818400
3818400 87872.1788028955 13.8942371285402 3476800
3476800 87842.0543708163 13.9170342642747 3481800
3481800 87670.5841054385 13.8808556469308
2559200 2559200
87800.6530231416 13.8874423695824 3841600
3841600 87804.3972028423
13.8657419719638
916400 916400
87776.1342228681 13.8622746230494
3839000 3839000 87662.8185016707 13.8576498806465
3835200 3835200 87933.6917697832 14.0007327053153
3482000 3482000 88323.3509854563 13.9453990979062 3485400 3485400 87657.5078357100 13.8478805156354 3484800 3484800 87757.3379321554
13.8215034461609 3475400 3475400 87970.4729449120
13.9605031841208 3481800
3481800 87612.4211302676
13.8327950845915 2319400
2319400 87521.5669854330 13.8383953325475
我希望line
成为一个数组而不是v
. 我究竟做错了什么?