使用:
set -o nounset
Run Code Online (Sandbox Code Playgroud)
1)有一个索引数组,如:
myArray=( "red" "black" "blue" )
Run Code Online (Sandbox Code Playgroud)
检查元素1是否设置的最短方法是什么?
我有时会使用以下内容:
test "${#myArray[@]}" -gt "1" && echo "1 exists" || echo "1 doesn't exist"
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一个首选的.
2)如何处理非连续索引?
myArray=()
myArray[12]="red"
myArray[51]="black"
myArray[129]="blue"
Run Code Online (Sandbox Code Playgroud)
如何快速检查'51'已经设置好了?
3)如何处理关联数组?
declare -A myArray
myArray["key1"]="red"
myArray["key2"]="black"
myArray["key3"]="blue"
Run Code Online (Sandbox Code Playgroud)
例如,如何快速检查'key2'是否已被使用?
谢谢
编辑
最简单的方式在我看来:
if test "${myArray['key_or_index']+isset}"
then
echo "yes"
else
echo "no"
fi;
Run Code Online (Sandbox Code Playgroud)
这适用于索引和关联数组.set -o nounset没有显示错误.
感谢headDown为headup.
我想要一个文件夹的同步副本及其所有子树.
它应该以这种方式自动工作:每当我创建,修改或删除原始文件夹中的内容时,这些更改都应自动应用于sync-folder.
哪个是完成此任务的最佳方法?
顺便说一句:我在Ubuntu 12.04上
最终目标是拥有一个独立的实时备份副本,而无需使用符号链接或mount.我使用Ubuntu One来同步我的计算机之间的数据,过了一段时间出了问题,我的所有数据都在同步过程中丢失了.
所以我想进一步增加一步来保留我的数据的备份副本:
cron带有rsync?的脚本可能是?).我需要它只是从A到B的单向方式,对B的任何更改都不能应用于A.受到lanzz评论的启发,另一个想法可能是在启动时运行rsync来备份Ubuntu One下的文件夹内容,并在rsync完成后启动Ubuntu One.
你觉得怎么样?如何知道rsync什么时候结束?
假设我有一个类似的集合:
$products = Mage::getModel('catalog/product')
->getCollection()
...
->load();
Run Code Online (Sandbox Code Playgroud)
如何打印执行的实际MySQL代码?
运行以下代码段:
#!/bin/bash
function preexec ()
{
echo -e "\n-->preexec command: $BASH_COMMAND"
}
trap 'preexec' DEBUG
function testfunc ()
{
echo "testfunc called $1"
}
testfunc "main"
source "source.sh"
exit 0
Run Code Online (Sandbox Code Playgroud)
其中source.sh是
#!/bin/bash
testfunc "source"
Run Code Online (Sandbox Code Playgroud)
得到:
-->preexec command: testfunc "main"
testfunc called main
-->preexec command: source "source.sh"
testfunc called source
-->preexec command: exit 0
Run Code Online (Sandbox Code Playgroud)
这意味着源文件中的每个命令都不会被DEBUG陷阱捕获.
事实上,如果我添加该行
trap 'preexec' DEBUG
Run Code Online (Sandbox Code Playgroud)
在source.sh内部作为第二行,一切都按照需要工作(源文件中的命令也被捕获).
如何将此作为默认行为,以避免为我需要提供的任何文件重复上述行?换句话说:有没有机会告诉源文件继承DEBUG陷阱?
我写了一个bash脚本,可以根据我的需要修改php.ini.
现在我必须引入一个新的变化,我找不到一个明确的解决方案.
我需要修改php.ini才能插入(如果以前没有插入的话)
extension="memcache.so"
Run Code Online (Sandbox Code Playgroud)
块之间
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
Run Code Online (Sandbox Code Playgroud)
和块
;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
Run Code Online (Sandbox Code Playgroud)
可能就在第二个之前.
有人可以帮我吗?提前致谢
编辑:使用解决
if ! grep -Fxq 'extension="memcache.so"' 'php.ini'; then
line=$(cat 'php.ini' | grep -n '; Module Settings ;' | grep -o '^[0-9]*')
line=$((line - 2))
sudo sed -i ${line}'i\extension="memcache.so"' 'php.ini'
fi
Run Code Online (Sandbox Code Playgroud) 拥有包含重复注释行的文件,例如:
# ScriptAlias /cgi-bin/ "somepath"
# ScriptAlias /cgi-bin/ "otherpath"
Run Code Online (Sandbox Code Playgroud)
我想在最后一次出现之后添加一行
# ScriptAlias /cgi-bin/ "somepath"
# ScriptAlias /cgi-bin/ "otherpath"
ScriptAlias /cgi-bin/ "mypath"
Run Code Online (Sandbox Code Playgroud)
为此,我正在使用此命令:
sed -i 's:^\(.*ScriptAlias /cgi-bin/.*\):\1 \nScriptAlias /cgi-bin/ "mypath":' file
Run Code Online (Sandbox Code Playgroud)
但这导致在每次出现后添加我的线条,如:
# ScriptAlias /cgi-bin/ "somepath"
ScriptAlias /cgi-bin/ "mypath"
# ScriptAlias /cgi-bin/ "otherpath"
ScriptAlias /cgi-bin/ "mypath"
Run Code Online (Sandbox Code Playgroud)
我怎么能告诉sed只替换最后一次出现?
编辑:
如果没有办法用sed解决它(如评论中所述),请提供相同结果的替代方案,谢谢.
编辑:
重复的线条可以分开,并且它们之间有其他线条
# ScriptAlias /cgi-bin/ "somepath"
# ScriptAlias /cgi-bin/ "otherpath"
# ScriptAlias /cgi-bin/ "another-path"
ScriptAlias /foo/ "just-jump"
# ScriptAlias /cgi-bin/ "that's the last"
Run Code Online (Sandbox Code Playgroud) 有这样的表:
sold_items:
code | size | quantity
abc123 | small | 4
abc123 | medium | 2
xyz987 | small | 3
xyz987 | medium | 1
xyz987 | large | 2
Run Code Online (Sandbox Code Playgroud)
价目单价目表:
code | size | price
abc123 | small | 5
abc123 | medium | 7
abc123 | large | 9
xyz987 | small | 10
xyz987 | medium | 13
xyz987 | large | 15
Run Code Online (Sandbox Code Playgroud)
这将是你最好的(更快的查询)方法
结果:
code | sold_items | cash
abc123 | 6 | 34 …Run Code Online (Sandbox Code Playgroud) 我必须避免在bash脚本中执行某个命令.
我想用一个preexec陷阱来做到这一点.
假设我想避免命令'source'仅用于axample.我做的基本上是以下几点:
#!/bin/bash
function preexec ()
{
if test $( echo "$BASH_COMMAND" | cut -d " " -f1 ) == "source"
then
echo ">>> do not execute this"
else
echo ">>> execute this"
fi
}
trap 'preexec' DEBUG
echo "start"
source "source.sh"
echo "go on"
exit 0
Run Code Online (Sandbox Code Playgroud)
这个想法很好,但此时我不知道如何避免执行所述命令.
不知道怎么解决这个问题?
在http.conf文件中有一个块,如:
<IfModule mime_module>
...
</IfModule>
Run Code Online (Sandbox Code Playgroud)
假设使用bash,我该如何检查以下行
AddHandler application/x-httpd-php .php
Run Code Online (Sandbox Code Playgroud)
已经添加到上一个块中,
如果没有,我怎样才能在其底部添加它
<IfModule mime_module>
...
AddHandler application/x-httpd-php .php
</IfModule>
Run Code Online (Sandbox Code Playgroud)
此块位于文件的中间:
文件内容不以此块开头或结尾.
编辑:
为了使这更难,我意识到我还需要进一步检查:很遗憾在我的问题中错过了它.如果上述行已作为注释行存在于所述块中
# AddHandler application/x-httpd-php .php
Run Code Online (Sandbox Code Playgroud)
(char#可能是该行的第一个char,或者之前可能有一些间隔,因为它可能在AddHandler的char A之前有或没有一些空格),我只需要取消注释它,否则我继续添加如上所述.