<?php

$tests = array(
	'du' => array(
		'max-depth' => 1,
		'human-readable' => TRUE, 'x' => TRUE,
		'./a/directory'
	),
	'ab' => array(
		'n' => 1000,
		'c' => 10,
		'http://w...content-available-to-author-only...e.com/'
	),
	'misc.sh' => array("red","green","blue","yellow")
);

function build_shell_args(Array $options = array(), $equals="=") {
	
	static $ok_chars = '/^[-0-9a-z_:\/\.]+$/i';
	
	$args = array();
	
	foreach ($options as $key => $val) if (!is_null($val) && $val !== FALSE) {
		
		$arg     = '';
		$key_len = 0;
		
		if(is_string($key) && ($key_len = strlen($key)) > 0) {
			
			if(!preg_match($ok_chars, $key))
				$key = escapeshellarg($key);
			
			$arg .= '-'.(($key_len > 1) ? '-' : '').$key;
		}
		
		if($val !== TRUE) {
			
			if((string) $val !== (string) (int) $val) {
				$val = print_r($val, TRUE);
				
				if(!preg_match($ok_chars, $val))
					$val = escapeshellarg($val);
				
			}
			
			if($key_len != 0)
				$arg .= $equals;
			
			$arg .= $val;
			
		}
		
		if(!empty($arg))
			$args[] = $arg;
		
	}
	
	return implode(' ', $args);
}

foreach($tests as $script => $args)
	echo escapeshellcmd("$script ".build_shell_args($args))."\n";